1、什么是Spring框架?Spring框架有哪些模块?
官方回答【Spring是一个开放源代码的设计层面框架,他解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用】。是一个轻量级的开源框架,是为解决企业应用开发的复杂性而创建的;
主要七大模块介绍
1. Spring AOP 面相切面编程
2. Spring ORM Hibernate|mybatis|JDO
3. Spring Core 提供bean工厂 IOC
4. Spring Dao JDBC支持
5. Spring Context 提供了关于UI支持,邮件支持等
6. Spring Web 提供了web的一些工具类的支持
7. Spring MVC 提供了web mvc , webviews , jsp ,pdf ,export
2、使用Spring框架能带来哪些好处?
1.低侵入式设计,代码污染极低
2.独立于各种应用服务器,基于Spring框架的应用,可以真正实现Write Once,Run Anywhere的承诺
3.Spring的DI机制降低了业务对象替换的复杂性,提高了组件之间的解耦
4.Spring的AOP支持允许将一些通用任务如安全、事务、日志等进行集中式管理,从而提供了更好的复用
5.Spring的ORM和DAO提供了与第三方持久层框架的良好整合,并简化了底层的数据库访问
6.Spring并不强制应用完全依赖于Spring,开发者可自由选用Spring框架的部分或全部
3、什么是控制反转(IOC)?什么是依赖注入(DI)?
Ioc—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想。一个重要的面向对象编程的法则,它能指导我们如何设计出松耦合、更优良的程序。传统应用程序都是由我们在类内部主动创建依赖对象,从而导致类与类之间高耦合,难于测试;有了IoC容器后,把创建和查找依赖对象的控制权交给了容器,由容器进行注入组合对象,所以对象与对象之间是 松散耦合,这样也方便测试,利于功能复用,更重要的是使得程序的整个体系结构变得非常灵活。(在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。)其实IoC对编程带来的最大改变不是从代码上,而是从思想上,发生了“主从换位”的变化。应用程序原本是老大,要获取什么资源都是主动出击,但是在IoC/DI思想中,应用程序就变成被动的了,被动的等待IoC容器来创建并注入它所需要的资源了。IoC很好的体现了面向对象设计法则之一—— 好莱坞法则:“别找我们,我们找你”;即由IoC容器帮对象找相应的依赖对象并注入,而不是由对象主动去找。
DI—Dependency Injection,即“依赖注入”:组件之间依赖关系由容器在运行期决定,形象的说,即由容器动态的将某个依赖关系注入到组件之中。依赖注入的目的并非为软件系统带来更多功能,而是为了提升组件重用的频率,并为系统搭建一个灵活、可扩展的平台。通过依赖注入机制,我们只需要通过简单的配置,而无需任何代码就可指定目标需要的资源,完成自身的业务逻辑,而不需要关心具体的资源来自何处,由谁实现。
4、BeanFacatory 和 ApplicationContext 有什么区别?
spring提供了两种容器,一是BeanFactory,一个是ApplicationContext应用上下文。
BeanFactory是spring比较原始 的Factory,例如xmlBeanFactory是一种典型的BeanFactory。原始的BeanFactory无法支持spring的许多插件,比如AOP功能,Web应用等。
ApplicationContext接口,继承于BeanFactory,能够提供BeanFactory的所有功能,它是一种更加面向框架的工作方式,此外ApplicationContext还提供 了如下功能:
MessageSource,提供国际化支持;资源访问,例如url和文件;事件传播;载入多个(有继承关系的上下文),使每个上下文都有一个特定的层次。比如Web。
(1)相同点
都是通过xlm来加载factory容器。
(2)不同点
A Bean何时加载?
BeanFactory是采用延时加载来注入Bean的,即只有在使用某个Bean时,调用getBean方法,来对该Bean进行加载实例化。
ApplicationContext则相反, 它是在容器启动时,一次创建所有的Bean,这样,在容器启动时,我们就可以发现Spring配置中存在的问题。
5、请解析Spring Bean 的生命周期?
Spring Bean的完整生命周期从创建Spring容器开始,直到最终Spring容器销毁Bean。

6、Spring Bean 的各种作用域之间有什么区别?
Spring的 bean有5种作用域分别是:singleton、prototype、request、session和globalSession
1.singleton:这种bean范围是默认的,这种范围确保不管接受到多少个请求,每个容器中只有一个bean的实例,单例的模式由bean factory自身来维护。
2.prototype:原形范围与单例范围相反,为每一个bean请求提供一个实例。
3.request:在请求bean范围内会每一个来自客户端的网络请求创建一个实例,在请求完成以后,bean会失效并被垃圾回收器回收。
4.Session:与请求范围类似,确保每个session中有一个bean的实例,在session过期后,bean会随之失效。
5.global-session:global-session和Portlet应用相关。当你的应用部署在Portlet容器中工作时,它包含很多portlet。如果你想要声明让所有的portlet共用全局的存储变量的话,那么这全局变量需要存储在global-session中。
7、Spring框架的单利Beans 是线程安全的么?
Spring框架并没有对单例bean进行任何多线程的封装处理。只是用容器装载起来而已。