毫无疑问,Spring是目前Java web的头号框架,而其最重要的特性就是IoC和AOP。
这里,我会用通俗的方式表达我对Spring IoC的理解
IoC 即 Inversion of Control,意为控制倒转。
它的实现需要DI,也就是依赖注入。
那么这个控制倒转到底是怎么倒转的呢?
其实就是让Spring控制。Spring说,你要什么类,都在我这里注册,我来向你提供管理,你可以自己制定一些管理的细节,要修改或者添加等等这些工作,通知我一下,让我来完成。
比如我们有A B C三个类,可能存在各种依赖,我们需要的时候就去跟Spring去注册,要修改的话,就告知Spring,而在运行的时候,Spring自然就会去把依赖修改掉。
我们不必因一个类的修改而改变大量的类的代码,我们要做的只是改变Spring的配置文件。
于是看起来,是Spring向我们需要操作的类下命令,而不是我们。这就是IoC。
可是,Spring具体是怎么搞定它的呢?为什么Spring能够完成找到Bean、创建Bean、配置Bean依赖等工作呢?
Spring涉及到IoC最主要的是两个数据结构:
一个是BeanDefinition,可以把它看成一个Map
另一个是BeanFactory等Spring IoC容器,暂且也当作Map好了
要想Spring框架对Bean的操作,就要先了解Spring中Bean的生命周期:
1、配置文件解析,IoC容器初始化
不管是BeanFactory,还是ApplicationContext的实现类,都是先解析我们的配置文件的(因为我们要通过修改配置文件的方式向Spring传达命令)
配置文件读取后,其中的内容会按照格式映射到BeanDefinition中,然后将字符串解析成类的信息,这时候读出来的信息就归属BeanDefinition管理了
BeanDefinition则会在解析后注册到Spring IoC容器中
2、Bean实例化
这一步就是通过getBean从IoC容器中获取Bean
getBean方法有许多重载函数,其实现比较复杂,也是IoC十分重要的一环
3、检查Aware相关接口并配置依赖
4、BeanPostProcessor前置处理
5、检查是否是IntializingBean,决定是否调用afterPropertiesSet方法
6、检查是否自定义init-method
7、BeanPostProcessor后置处理
8、注册Destruction相关接口
9、使用
10、销毁