1. 什么是spring IOC容器?

    Spring IOC负责创建对象,管理对象(通过依赖注入DI),装配对象,配置对象,并且管理这个对象的整个生命周期。

2. IOC的优点是什么?

    IOC减少了应用的代码量,最小的代价和最小的侵入性是的松散耦合得以实现。

3. Spring有几种注入方式?

    (1) 构造方法依赖注入:构造器依赖注入是通过容器触发一个类的构造方法来实现的,该方法有一系列参数,每个参数对应一个其他类的依赖。

    (2) setter方法注入:setter方法注入是容器通过调用无参构造器或者无参静态工厂方法实例化Bean之后,调用bean的setter方法实现依赖注入。

    (3) 基于注解的依赖注入:即“@Autowired”(或者“@Resource”)注解,在实例化Bean是,spring会将被此注解标记的依赖通过Java的反射机制注入。

4. Autowired和Resource的区别是什么? 

    (1)@Autowired与@Resource都可以用来装配bean. 都可以写在字段上,或写在setter方法上。
    (2)@Autowired默认按类型装配(这个注解是属业spring的),默认情况下必须要求依赖对象必须存在,如果要允许null值,可以设置它的required属性为false,如:@Autowired(required=false) ,如果我们想使用名称装配可以结合@Qualifier注解进行使用.
    (3) @Resource 是JDK1.6支持的注解,默认按照名称进行装配,名称可以通过name属性进行指定,如果没有指定name属性,
当注解写在字段上时,默认取字段名,按照名称查找,如果注解写在setter方法上默认取属性名进行装配。当找不到与名称匹配的
bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。

5. Spring的Bean有几种作用域?它们的区别?

Spring容器最初提供了两种bean的scope类型:singleton和prototype,但发布2.0以后,又引入了另外三种scope类型:request、session和global session,这三种只能在web 应用中才可以使用。

    singleton: 在Spring的IoC容器中只存在一个对象实例,所有该对象的引用都共享这个实例。Spring 容器只会创建该bean定义的唯一实例,这个实例会被保存到缓存中,并且对该bean的所有后续请求和引用都将返回该缓存中的对象实例,一般情况下,无状态的bean使用该scope,spring默认的作用域也是singleton。
    prototype:每次对该bean的请求都会创建一个新的实例,一般情况下,有状态的bean使用该scope。
    request:每次http请求将会有各自的bean实例,类似于prototype。
    session:在一个http session中,一个bean定义对应一个bean实例。

    global session:在一个全局的http session中,一个bean定义对应一个bean实例。典型情况下,仅在使用portlet context的时候有效。

6. Spring是怎么进行事务管理的?

spring支持编程式事务管理和声明式事务管理两种方式。

编程式事务管理使用TransactionTemplate或者直接使用底层的PlatformTransactionManager。对于编程式事务管理,spring推荐使用TransactionTemplate。

声明式事务管理建立在AOP之上的。其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。声明式事务最大的优点就是不需要通过编程的方式管理事务,这样就不需要在业务逻辑代码中掺杂事务管理的代码,只需在配置文件中做相关的事务规则声明(或通过基于@Transactional注解的方式),便可以将事务规则应用到业务逻辑中。

显然声明式事务管理要优于编程式事务管理,这正是spring倡导的非侵入式的开发方式。声明式事务管理使业务代码不受污染,一个普通的POJO对象,只要加上注解就可以获得完全的事务支持。和编程式事务相比,声明式事务唯一不足地方是,后者的最细粒度只能作用到方法级别,无法做到像编程式事务那样可以作用到代码块级别。但是即便有这样的需求,也存在很多变通的方法,比如,可以将需要进行事务管理的代码块独立为方法等等。

7.Spring的事务传播机制?

Propagation.REQUIRED:方法被调用时自动开启事务,在事务范围内使用则使用同一个事务,否则开启新事务。       
 Propagation.REQUIRES_NEW:无论何时自身都会开启事务
 Propagation.SUPPORTS:自身不会开启事务,在事务范围内则使用相同事务,否则不使用事务
 Propagation.NOT_SUPPORTED:自身不会开启事务,在事务范围内使用挂起事务,运行完毕恢复事务
 Propagation.MANDATORY:自身不开启事务,必须在事务环境使用否则报错
 Propagation.NEVER:自身不会开启事务,在事务范围使用抛出异常
 Propagation.NESTED:如果一个活动的事务存在,则运行在一个嵌套的事务中. 如果没有活动事务, 则按TransactionDefinition.PROPAGATION_REQUIRED 属性执行。需要JDBC3.0以上支持。