1、IOC概念理解
IOC(Inversion of Control)即“控制反转”,不是什么技术,而是一种设计思想。在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制,IOC容器负责实例化、定位、配置应用程序中的对象及建立这些对象间的依赖,由spring来负责控制对象的生命周期和对象间的关系。
DI(Dependency Injection)即“依赖注入”:由容器动态的将某个依赖关系注入到组件之中。依赖注入的目的并非为软件系统带来更多功能,而是为了提升组件重用的频率,并为系统搭建一个灵活、可扩展的平台。
例如:你将需要寻找的理想中的对象(胸大、屁股大、年轻、有文化)交给婚姻中介来控制,而不是你主动去找去控制寻找,由中介为你寻找(过程你毫不知情),你选择是否接受中介为你匹配到的对象。这个过程中主动找理想对象的控制权从你到中介为:控制反转;中介输出给你的对象为:依赖注入;
(2)spring的两种Ioc容器
BeanFactory:
BeanFactory是基础类型IOC容器。顾名思义,就是生产Bean的工厂。能够提供完整的IOC服务。没有特殊指定的话,其默认采用延迟初始化策略。只有当客户端对象需要访问容器中的某个受管对象的时候,才对该对象进行初始化和依赖注入操作。因此,相对来说,容器启动初期的时候速度是比较快的。所需要的资源有限。所以,对资源有限,并且功能要求不是很严格的场景,BeanFactory是比较合适的IOC容器。
ApplicationContext:
ApplicationContext是在BeanFactory的基础上边构建的,是相对比较高级的容器的实现,除了拥有BeanFactory的所有支持,ApplicationContext还提供了其他的高级特性。例如事件发布、国际化信息支持等。ApplicationContext所管理的对象,在该类型容器启动之后,默认全部初始化并绑定完成。相对于BeanFactory来说,ApplicationContext会要求更多的系统资源。因为在启动时就完成了所有的初始化,容器启动的时间与BeanFactory相比会长一些。因此,ApplicationContext更适用于系统资源充足,并且要求更多功能的场景中。
ApplicationContext间接继承自BeanFactory,所以说它是构建与BeanFactory之上的IOC容器。
比较:
BeanFacotry是spring中比较原始的Factory。它无法支持spring的许多插件,如AOP功能、Web应用等。
ApplicationContext接口,它由BeanFactory接口派生而来,因而提供BeanFactory所有的功能。
ApplicationContext以一种更向面向框架的方式工作以及对上下文进行分层和实现继承,
ApplicationContext包还提供了以下的功能:
• MessageSource, 提供国际化的消息访问
• 资源访问,如URL和文件 • 事件传播 • 载入多个(有继承关系)上下文 ,使得每一个上下文都专注于一个特定的层次,比如应用的 web层
BeanFactroy采用的是延迟加载形式来注入Bean的,即只有在使用到某个Bean时(调用getBean()),才对该Bean进行加载实例化,这样,我们就不能发现一些存在的Spring的配置问题。
而ApplicationContext则相反,它是在容器启动时,一次性创建了所有的Bean。在容器启动时,我们就可以发现Spring中存在的配置错误。
(3)Spring IOC 注入方式
3.1 setter注入:
1 <bean > 2 <!--此处的value的注入是通过set方法--> 3 <property name="who" value="spring"></property> 4 <property name="you" value="123456789"></property> 5 </bean>