正文
Spring IOC容器
Spring的核心功能就是我们大家耳熟能详的两大核心的功能:DI、AOP,就是依赖注入以及面向切面编程。根据我自己的理解IOC容器就是管理我们对象组件的创建,初始化、使用、销毁的整体的过程。当然简单的说就是:ApplicationContext就是IOC容器,因为他就是管理我们的组件的所有的行为的。
Spring 的启动过程
1. 新建ApplicationContext对象
我的代码跟踪使用的是注解的方式,第一步没我们要使用IOC容器,那么,我们就要进行创建IOC容器。
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig2.class);
2. 调用refresh();方法,初始化我们的IOC容器
public AnnotationConfigApplicationContext(Class... annotatedClasses) { this(); register(annotatedClasses); refresh(); }
3. 为刷新这个上下文作准备:prepareRefresh();
这个方法的主要作用:
1、清空这个环境的所有类信心
2、准备在加载这个容器进行预处理,比如设置启动的时间;是否增在启动,初始化PropertySources、验证初始化的PropertySources
4. 获取到IOC容器的beanFactory
:beanFactory = obtainFreshBeanFactory();
1、刷新beanFactory,这个beanFactory的类型是DefaultListableBeanFactory。
2、获取beanFactory
3、返回beanFactory
5. 对上一步获取到的beanFactory做预处理
prepareBeanFactory(beanFactory);
1、告诉这个beanFactory使用什么类加载器
2、EL表达式解析器
3、设置属性值的解析器
4、增加ApplicationContextAwareProcessor的后置处理器
5、设置一些忽略依赖的接口
6、设置ApplicationListenerDetector后置处理器获取到 ApplicationListeners
6. postProcessBeanFactory(beanFactory);
给子类一个机会,更改当前的beanFactory的里面的一些属性。
7. 调用IOC容器中所有的BeanFactoryPostProcessors
invokeBeanFactoryPostProcessors(beanFactory);
在这里,我们会调用这个容器中所有实现BeanFactoryPostProcessor接口的的后置处理器。
1,首先,调用所有的BeanDefinitionRegistryPostProcessor的后置处理器,他的作用是更改目前我们IOC容器的所有的bean的定义,这时候所有的bean组件还是没有创建的状态。
在调用的过程中,会将不同优先级的后置处理器分类(PriorityOrdered、Ordered、还有什么都没有实现的),依次处理BeanDefinitionRegistryPostProcessor。
2.调用完BeanDefinitionRegistryPostProcessor所有的后置处理器后,会调用普通的BeanFactoryPostProcessor的后置处理器。调用过程与上面的类似,也是进行分类进行处理。
思考:这些beanFactory的后置处理器是在bean 定义存在,但是这个时候这些组件是是没有创建实例化的。
8. registerBeanPostProcessors(beanFactory);
注册bean的后置处理器,注册,实际上就是将bean的后置处理器加入到beanFactory中,当我们创建bean的时候,会调用这些bean的后置处理器。
9. 初始化MessageSource
初始化MessageSource,默认的类型是DelegatingMessageSource,这个对象对于我们的国际化。
10. 初始化:ApplicationEventMulticaster 事件广播器
我们可以用这个广播器广播一些我们需要通知的事件,spring-mvc启动的过程中也用到了事件的广播器,初始化我们的9大组件。
11. 调用子类重写的方法,初始化一些特殊的bean:
onRefresh();
我们在创建组件之前,可能会用子类初始化一些特殊的bean组件,来满足我们的系统的使用。
12. 检查listener并且注册他们
向我们前面初始化的事件广播器注册Spring的事件的listener。
getApplicationEventMulticaster().addApplicationListener(listener);
13. 初始化我们所有定义剩余的bean
finishBeanFactoryInitialization(beanFactory);
这个过程是用饿汉式初始化所有单例的bean组件。这个过程也就是我们getBean的过程。
14. IOC容器启动的最后一步:finishRefresh();
在这部分:
1、初始化生命周期的后置处理器
2、发布IOC容器启动结束的event
3 、等等收尾的工作