Spring框架总结之依赖注入(一)
DI(Depandency Injection),也叫“依赖注入”,与人也称其为“控制反转(IOC)”,而我更喜欢把它称之为DI。传统的Java对象,对其本身及关联的对象(Bean),都是自主创建和管理的,这样就导致高度耦合和难以测试的问题。而Spring框架则意识到这个问题,其提供的DI功能,可以完美的解决Bean及其依赖的Bean的创建、装配及生命周期等管理工作,这个管理机制称为“Spring容器”,也是Spring框架的核心模块。这里我会从Spring的DI原理、Bean生命周期及Bean装配三方面介绍DI。后续文章中,会以一例子来贯穿同类文章中的DI实现方式和细节的介绍,对于通用的代码和内容只会罗列一次,有需要的读者,可以跳转查看。
l DI工作原理
l Bean生命周期
l Bean装配机制
1、DI工作原理
如上图所示,Spring 注入机制首先将Bean注入到容器中,而这些Bean会被自动实例化,默认情况下,它们以单例模式存在。然后,Spring装配机制,借助Java的映射机制,获取已经实例化Bean对象,并根据Java描述对象关系的XML或 JavaConfig配置关系,将被依赖的Bean的引用,嵌入到依赖主体的Bean中,这里对应A为依赖主体Bean,而B、C则是被依赖Bean,也就是A需要依赖B和C才能完成某件功能的关系。另外,在图中没有体现的是Spring对这些Bean生命周期的管理,那么在下面看下Bean的整个生命周期是什么?
2、Bean生命周期
如上图所示,这里使用方法调用过程演示Bean的生命周期:
1、容器对Bean实例化,并对Bean的引用和值注入到Bean;
2、若Bean实现BeanNameAware接口,Spring会将Bean的id传递给setBeanName方法;
3、若Bean实现BeanFactoryAware接口,Spring将调用其对应的setBeanFactory方法,并将BeanFactory实例传递进去;
4、若Bean实现ApplicationContextAware接口,Spring将调用它的setApplicationContext方法,将对应Bean的上下文引用传递进去;
5、若Bean实现BeanPostProcessor接口,Spring将调用对应的processBeforeInitialization方法预初始化准备工作;
6、若Bean实现InitializingBean接口,Spring将调用afterPropertiesSet方法。如果实现了init-method (自定义实现)方法,那么这个方法也同样被调用;
7、若Bean实现BeanPostProcessor接口,Spring将调用processAfterInitialization方法结束初始化准备工作;
8、到这里,Bean已经可以使用了,它们会一直驻留在应用上下文中,直到其应用上下文被回收掉或销毁为止;
9、若Bean实现DisposableBean接口,Spring将调用其destory方法。如果实现了destory-method(自定义实现)方法,它也会被调用;
Note:
Spring的DI的工作机制表复杂,这里只抽象出它的实现原理结构及Bean的生命周期的一系列节点过程。
3、Bean装配机制
如上图所示,请结合上面的DI原理和Bean生命周期查看本部分内容,而这里主要介绍Profile和Assembly Method。它们是在Spring3引入的新特性,主要用来在运行时动态装配值或引用到Bean的属性和构造方法中,当然,默认的情况是硬编码方式,装配和简历关系,至于硬编码的好坏这里不做介绍。对于Profile,它主要用在注入和装配不同配置的开关的,也就是放在Profile范围内的Bean(该Profile被激活),才能被注入和装配,否则Spring只能注入和装配未在Profile范围的Bean,它常用在应用部署环境迁移方面。
好了,本篇就介绍这里,后续文章将继续总结Spring装配的实现及各个细节的详细实现。由于作者水平有限,请在评论或(QQ: 245389109)不吝赐教,谢谢。