**1. 为什么要使用 spring?** - spring 提供 ioc 技术,容器会帮你管理依赖的对象,从而不需要自己创建和管理依赖对象了,更轻松的实现了程序的解耦。 - spring 提供了事务支持,使得事务操作变的更加方便。 - spring 提供了面向切片编程,这样可以更方便的处理某一类的问题。 - 更方便的框架集成,spring 可以很方便的集成其他框架,比如 MyBatis、hibernate 等。 ***** **2.什么是依赖注入?** 在依赖注入中,您不必创建对象,但必须描述如何创建它们。您不是直接在代码 中将组件和服务连接在一起,而是描述配置文件中哪些组件需要哪些服务。由 IoC 容器将它们装配在一起。 ***** **3. 解释一下什么是 ioc?** ioc:Inversion of Control(中文:控制反转)是 spring 的核心,对于 spring 框架来说,就是由 spring 来负责控制对象的生命周期和对象间的关系。 简单来说,控制指的是当前对象对内部成员的控制权;控制反转指的是,这种控制权不由当前对象管理了,由其他(类,第三方容器)来管理。 ***** **4. spring 有哪些主要模块?** - spring core:框架的最基础部分,提供 ioc 和依赖注入特性。 - spring context:构建于 core 封装包基础上的 context 封装包,提供了一种框架式的对象访问方法。 - spring dao:Data Access Object 提供了JDBC的抽象层。 - spring aop:提供了面向切面的编程实现,让你可以自定义拦截器、切点等。 - spring Web:提供了针对 Web 开发的集成特性,例如文件上传,利用 servlet listeners 进行 ioc 容器初始化和针对 Web 的 ApplicationContext。 -spring Web mvc:spring 中的 mvc 封装包提供了 Web 应用的 Model-View-Controller(MVC)的实现。 ***** **5. spring 常用的注入方式有哪些?** - setter属性注入 - 构造方法注入 - 注解方式注入 ***** **6. spring 中的 bean 是线程安全的吗?** spring 中的 bean 默认是单例模式,spring 框架并没有对单例 bean 进行多线程的封装处理。 实际上大部分时候 spring bean 无状态的(比如 dao 类),所有某种程度上来说 bean 也是安全的,但如果 bean 有状态的话(比如 view model 对象),那就要开发者自己去保证线程安全了,最简单的就是改变 bean 的作用域,把“singleton”变更为“prototype”,这样请求 bean 相当于 new Bean()了,所以就可以保证线程安全了。 - 有状态就是有数据存储功能。 - 无状态就是不会保存数据。 ***** **7. spring 支持几种 bean 的作用域?** spring 支持 5 种作用域,如下: - singleton:spring ioc 容器中只存在一个 bean 实例,bean 以单例模式存在,是系统默认值; - prototype:每次从容器调用 bean 时都会创建一个新的示例,既每次 getBean()相当于执行 new Bean()操作; Web 环境下的作用域: - request:每次 http 请求都会创建一个 bean; - session:同一个 http session 共享一个 bean 实例; - global-session:用于 portlet 容器,因为每个 portlet 有单独的 session,globalsession 提供一个全局性的 http session。 注意: 使用 prototype 作用域需要慎重的思考,因为频繁创建和销毁 bean 会带来很大的性能开销。 ***** **8. spring 自动装配 bean 有哪些方式?** - no:默认值,表示没有自动装配,应使用显式 bean 引用进行装配。 - byName:它根据 bean 的名称注入对象依赖项。 - byType:它根据类型注入对象依赖项。 - 构造函数:通过构造函数来注入依赖项,需要设置大量的参数。 - autodetect:容器首先通过构造函数使用 autowire 装配,如果不能,则通过 byType 自动装配。 ***** **9. spring 事务实现方式有哪些?** - 声明式事务:声明式事务也有两种实现方式,基于 xml 配置文件的方式和注解方式(在类上添加 @Transaction 注解)。 - 编码方式:提供编码的形式管理和维护事务。 ***** **10. 说一下 spring 的事务隔离?** spring 有五大隔离级别,默认值为 ISOLATION_DEFAULT(使用数据库的设置),其他四个隔离级别和数据库的隔离级别一致: - ISOLATION_DEFAULT:用底层数据库的设置隔离级别,数据库设置的是什么我就用什么; - ISOLATIONREADUNCOMMITTED:未提交读,最低隔离级别、事务未提交前,就可被其他事务读取(会出现幻读、脏读、不可重复读); - ISOLATIONREADCOMMITTED:提交读,一个事务提交后才能被其他事务读取到(会造成幻读、不可重复读),SQL server 的默认级别; - ISOLATIONREPEATABLEREAD:可重复读,保证多次读取同一个数据时,其值都和事务开始时候的内容是一致,禁止读取到别的事务未提交的数据(会造成幻读),MySQL 的默认级别; ISOLATION_SERIALIZABLE:序列化,代价最高最可靠的隔离级别,该隔离级别能防止脏读、不可重复读、幻读。 ***** **11.spring 中有多少种 IOC 容器?** - BeanFactory - BeanFactory 就像一个包含 bean 集合的工厂类。它会在客户端 要求时实例化 bean。 - ApplicationContext - ApplicationContext 接口扩展了 BeanFactory 接口。它 在 BeanFactory 基础上提供了一些额外的功能。