您的位置:首页 > 编程语言 > Java开发

Spring

2016-03-24 17:34 417 查看
1、什么是Spring?

Spring是分层的JavaSE/EE full-stack(一站式)轻量级开源框架。

☆ JavaEE程序在服务器端被分为三层(Web层(表现层)、业务逻辑层、数据访问层(集成层、持久层))

☆ Struts2是表现层MVC的框架

☆ Hibernate是数据访问层(持久层)的完全ORM框架

Spring框架中包括JavaEE三层的 每一层的解决方案 (一站式)

☆ web层 :SpringMVC

☆ 业务层 :Spring Bean管理、AOP、事务管理

☆ 持久层 :Spring JDBCTemplate、ORM模块(整合其他持久层框架)

2、Spring给软件开发带来了什么?(六个优点)

a、方便解耦,简化开发

Spring就是一个大工厂,将对象创建和依赖关系维护交给Spring管理。

b、AOP编程的支持

可以方便的实现对程序进行权限拦截、运行监控等功能。

c、声明式事务管理

只需要通过配置就可以完成对事物的管理,无需手动编程。

d、方便程序测试

支持Junit4,通过注解方便测试

e、方便集成各种优秀框架

Spring不排斥各种优秀的开源框架,内部提供了对各种优秀框架(Struts、Hibernate、Mybatis、Quartz等的直接支持)

f、降低JavaEE API的使用难度

Spring对JavaEE开发中非常难用的一些API(JDBC、JavaMail远程调用等)进行封装——>使这些API应用难度大大降低。

3、IOC和DI的区别?

IOC:Inverse of Control 控制反转:将原来程序中自己手动构造对象的权利交给Spring的IOC容器来构造,简单说,就是创建对象的控制权被反转到了Spring框架。

如果需要一个对象,从容器去获取一个对象。(对象的构造权被反转)

解决程序对象紧密耦合(如果要更改接口实现,必须修改代码)的问题,(工厂+反射+配置文件),将程序中原来构造对象的权限,交给IOC容器来构造,当程序需要对象,找IOC容器获取。

DI:Dependency Injection 依赖注入,在Spring框架负责创建Bean对象时,动态的将依赖对象注入到Bean组件。

例如:Servlet需要Service,找IOC容器获取Service,而Service依赖DAO,IoC容器提供Service的同时,将Service依赖的DAO注入到Service中。

面试题:IOC 和DI的区别?

IoC:控制反转,指将对象的创建权,反转到Spring容器。

DI:依赖注入,指Spring创建对象的过程中,将对象依赖属性通过配置进行注入。

所以,依赖注入(DI)和控制反转(IoC)是从不同的角度描述的同一件事情,就是指通过引入IoC容器,利用依赖关系注入的方式实现对象之间的解耦。

其它:

IoC完成了类对象的生成以及类与类之间依赖关系的管理,将类本身以及依赖类生成对象的过程和功能从业务代码中解放出来(这些功能本来也不应该由业务类完成),这样就分清了职责。而且依靠面向接口编程,完成了类和类之间依赖的解耦。分清职责、依赖解耦的好处:程序扩展性、可维护性提高。

4、AOP:面向切面编程

AOP:主要是弥补了面向对象编程缺点(继承等都是纵向方面),从横向方面将可能散列在程序不同角落里的代码集中管理起来,这样程序的维护性、扩展性大幅提高。

5、描述一下Spring中实现DI(Dependency Injection)的几种方式?

方式一:接口注入,在实际中得到了普遍应用,即使在IOC的概念尚未确立时,这样的方法也已经频繁出现在代码中。

方式二:IoC:Setter Injection 对象创建之后,将被依赖对象通过set方法设置进去。

方式三:IoC:Constructor Injection 对象创建时,被依赖对象以构造方法参数的方式注入。

6、Spring对很多ORM框架提供了很好支持,描述下在Spring使用Hibernate的方法?

在context中定义DataSource,创建SessionFactory,设置参数;

DAO类继承HibernateDaoSupport,实现具体接口,从中获得HibernateTemplate进行具体操作。

在使用中如果遇到OpenSessionInView的问题,可以添加OpenSessionInViewFilter或OpenSessionInViewInterceptor。

7、请介绍下Spring的事务管理?

Spring提供了几个关于事务处理的类:

TransactionDefinition //事务属性定义

TransactionStatus //代表了当前的事务,可以提交、回滚

PlatformTransactionManager 这个是Spring提供的用于管理事务的基础接口,其下有一个实现的抽象类

AbstractPlatformTransactionManager 我们使用的事务管理类,例如DataSourceTransactionManager等都是这个类的子类。

一般事务定义步骤:

<span style="white-space:pre">	</span>TransactionDefinition td = new TransactionDefinition();
<span style="white-space:pre">	</span>TransactionStatus ts = transactionManager.getTransaction(td);
<span style="white-space:pre">	</span>try
<span style="white-space:pre">	</span>{ //do sth
<span style="white-space:pre">	</span>transactionManager.commit(ts);
<span style="white-space:pre">	</span>}
<span style="white-space:pre">	</span>catch(Exception e){transactionManager.rollback(ts);}
Spring提供的事务管理可以分为两类:编程式的和声明式的。

编程式的,比较灵活,但是代码量大,存在重复的代码比较多;声明式的比编程式的更灵活。

编程式主要使用transactionTemplate,省略了部分的提交、回滚,一系列的事物对象定义,需注入事务管理对象。

<span style="white-space:pre">	</span>void add()
<span style="white-space:pre">	</span>{
<span style="white-space:pre">	</span>transactionTemplate.execute( new TransactionCallback(){
<span style="white-space:pre">	</span>pulic Object doInTransaction(TransactionStatus ts)
<span style="white-space:pre">	</span>{ //do sth}
<span style="white-space:pre">	</span>}
<span style="white-space:pre">	</span>}
声明式:

使用TransactionProxyFactoryBean:

PROPAGATION_REQUIRED PROPAGATION_REQUIRED PROPAGATION_REQUIRED, readOnly

围绕Proxy的动态代理,能够自动的提交和回滚事务。

org.springframework.transaction.interceptor.TransactionProxyFactoryBean

PROPAGATION_REQUIRED–支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。

PROPAGATION_SUPPORTS–支持当前事务,如果当前没有事务,就以非事务方式执行。

PROPAGATION_MANDATORY–支持当前事务,如果当前没有事务,就抛出异常。

PROPAGATION_REQUIRES_NEW–新建事务,如果当前存在事务,把当前事务挂起。

PROPAGATION_NOT_SUPPORTED–以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

PROPAGATION_NEVER–以非事务方式执行,如果当前存在事务,则抛出异常。

PROPAGATION_NESTED–如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作。

8、如何在Spring的applicationContext.xml使用JNDI而不是DataSource?

可以使用“org.springframework.jndi.JndiObjectFactoryBean"来实现。示例如下:

<span style="white-space:pre">	</span><bean id=”dataSource”>
    <span style="white-space:pre">		</span><property name=”jndiName”>
        <span style="white-space:pre">		</span><value>java:comp/env/jdbc/appfuse</value>
    <span style="white-space:pre">		</span></property>
<span style="white-space:pre">	</span></bean>


9、在Spring中是如何配置数据库驱动的?

org.springframework.jdbc.datasource.DriverManagerDataSource;数据源来配置数据库驱动。示例如下:

<bean id=”dataSource”>
    <property name=”driverClassName”>
        <value>org.hsqldb.jdbcDriver</value>
    </property>
    <property name=”url”>
        <value>jdbc:hsqldb:db/appfuse</value>
    </property>
    <property name=”username”><value>sa</value></property>
    <property name=”password”><value></value></property>
</bean>


10、Spring中的applicationContext.xml能不能改为其它名字?

ContextLoaderListener是一个ServletContextListener,它在你的web应用启动的时候初始化。缺省情况下,它会在WEB-INF/applicationContext.xml文件中找Spring的配置。你可以通过定义一个<context-param>元素名字为”contextConfigLocation“来改变Spring配置文件的位置。示例如下:

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener
 
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/xyz.xml</param-value>
    </context-param>
 
    </listener-class>
</listener>


11、在web中如何配置Spring?

在J2EE的web应用里面配置Spring非常简单,最简单的只需要把Spring的ContextLoaderListener添加到web.xml文件里面就可以了。示例如下:

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>


12、在Spring中如何定义Hibernate Mapping?

添加Hibernate mapping文件到web/WEB-INF目录下的applicationContext..xml文件里面。示例如下:

<property name=”mappingResources”>
    <list>
        <value>org/appfuse/model/User.hbm.xml</value>
    </list>
</property>


13、两种依赖注入的类型是什么?

两种依赖注入的类型分别是setter注入和构造方法注入。

setter注入:一般情况下所有的java bean,我们都会使用setter方法和getter方法去设置和获取属性的值,示例如下:

public class namebean {
     String      name;  
     public void setName(String a) {
         name = a; }
     public String getName() {
        return name; }
    }
我们会创建一个bean的实例然后设置属性的值,Spring的配置文件如下:

<bean id=”bean1″  >
   <property   name=”name” >
       <value>tom</value>
   </property>
</bean>
Spring会调用setName方法来只是name熟悉为tom

构造方法注入:构造方法注入中,我们使用带参数的构造方法如下:

public class namebean {
     String name;
     public namebean(String a) {
        name = a;
     }   
}
我们会在创建bean实例的时候以new namebean(”tom")的方式来设置name属性,Spring配置文件如下:

<bean id=”bean1″ >
    <constructor-arg>
       <value>My Bean Value</value>
   </constructor-arg>
</bean>
使用constructor-arg标签来设置构造方法的参数。

14、Spring中BeanFactory和ApplicationContext的作用和区别?

作用:

1、BeanFactory负责读取bean配置文档,管理bean的加载,实例化,维护bean之间的依赖关系,负责bean的生命周期。

2、ApplicationContext除了提供上述BeanFactory所能提供的功能之外,还提供了更完整的框架功能:

a、国际化支持

b、资源访问:Resource rs = ctx.getResource("classpath:config.properties"),"file:c:/config.properties"

c、事件传递:通过实现ApplicationContextAware接口

3、常用的获取ApplicationContext的方法:

FileSystemXmlApplicationContext:从文件系统或者URL指定的xml配置文件创建,参数为配置文件名或文件名数组

ClassPathXMLApplicationContext:从classpath的xml配置文件创建,可以从jar包中读取配置文件

WebApplicationContextUtils:从web应用的根目录读取配置文件,需要先在web.xml中配置,可以配置监听器或者servlet来实现
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>context</servlet-name>
<servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
这两种方式都默认配置文件为WEB-INF/applicationContext.xml,也可以使用context-param指定配置文件

<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/myApplicationContext.xml</param-value>
</context-param>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: