Spring(二) Inversion of Control (IoC)
参考文献
什么是IoC?
控制反转IoC(Inversion of Control),是一种设计思想,DI(依赖注入)是实现IoC的一种方法;
- 将对象的创建和组装的主动控制权都交给Spring容器来完成,使用这只需要从Spring容器中查找需要的使用的对象.
- 主要是为了降低系统代码的耦合度,让系统利于维护和扩展.
- Spring容器主要负责容器中对象的创建,组装,对象查找,对象生命周期的管理等等操作.
IoC容器的职责
- 实现与执行的任务之间要解耦;
- 实现bean的管理,让应用程序不用过渡关注bean的生命周期以及依赖;
- IoC容器是具有依赖注入功能的容器,负责对象的实例化,对象的初始化,对象和对象之间依赖关系配置,对象销毁,对外提供对象的查找等操作,对象的整个生命周期都是由容器来控制.
通用职责
-
依赖处理
- 依赖查找
- 依赖注入
-
生命周期管理
- 容器的生命周期(启动,停止…);
- 托管的资源(Java Beans或其他资源的生命周期);
-
配置
- 容器的配置
- 外部化配置
- 托管的资源(Java Beans或其他资源)
如何实现IoC
?
IoC主要实现策略
- 使用服务定位模式(
Service locator pattern
)- Java EE 中使用的模式,一般通过 JNDI 技术获取Java EE组件,如获取 EJB 组件,或者DataSource相关数据源。
- 依赖注入(
Dependency injection
)- 构造器注入
- 参数注入
- Setter注入
- 接口注入
- 上下文的依赖查询(
ContextUalized lookup
)- Spring 参考了Java Beans中的实现方式,Java Beans 中有一个通用的上下文 BeanContext,既可以传输Bean,又可以管理Bean的层次;
- 模板方法(
Template Method Design Pattern
) - 策略模式(
Strategy Design patten
)
IoC的具体实现
- Java SE
- Java Beans
- Java ServiceLoader SPI
- JNDI(Java Naming and Directory Interface)
- Java EE
- EJB(Enterprise Java Beans)
- Servlet
- 开源
- Apache Avalon
- PicoContainter
- Google Guice
- Spring Framework
传统IoC容器的实现
- Java Beans作为IoC容器
- 特性
- 依赖查找
- 生命周期管理
- 配置元信息
- 事件
- 自定义
- 资源管理
- 持久化
- 特性
Spring IoC依赖来源
- 自定义Bean(自己用XML配置或注解配置的Bean)
- 容器内建Bean对象(非自己定义的B`ean,Spring容器初始化的Bean)
- 容器内建依赖(非Bean,不能通过依赖查找获取,getBean(XX));
- 通过
AutowireCapableBeanFactory#resolveDependency()
方法来注册,并非是一个Spring Bean,无法通过依赖查找获取;
- 通过
Spring IoC配置元信息
- Bean定义配置
- 基于XML文件
- 基于Properties文件
- 基于Java注解
- 基于JavaAPI
- IoC容器配置
- 基于XML文件
- 基于Java注解
- 基于Java API
- 外部化属性配置
- 基于Java注解
@Value
- 基于Java注解
Spring 应用上下文
- ApplicationContext除了IoC容器角色,还提供
- 面向切面(AOP)
- 配置元信息(Configuration MetaData)
- 资源管理(Resources)
- 事件(Events)
- 国际化(il8n)
- 注解(Annotations)
- Environment对象(Environment Abstracttion)
使用Spring IoC容器
org.springframework.beans.factory.BeanFactory
是Spring底层IoC容器org.springframework.context.ApplicationContext
是具备应用特征的BeanFactory
超集
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 HoleLin's Blog!