一、Spring容器的概念
- Spring容器:主要是指IOC容器;也是Spring框架的核心技术,IOC容器主要的作用就是管理对象的创建及属性的赋值,及单例对象的销毁回收;SpringIOC容器管理对象的方式是DI(依赖注入)。
- SpringIOC的种类:Spring BeanFactory容器与Spring ApplicationContext容器
- Spring BeanFactory容器: 最简单的容器,给DI提供了基本的支持。移动设备中为了节省有限的资源,会被优先选择,即主要用于轻量级应用。其用org.springframework.beans.factory.BeanFactory接口来定义。
- Spring ApplicationContext容器: 在Spring BeanFactory容器的基础上,添加了更多企业特定的功能,比如后置通知,事件的监听等等...
二、常见的Spring ApplicationContext容器:
在Spring中一般会有两种方式保存bean的定义信息,一种是Xml文件,另一种是注解形式(@Service、@Component、@Bean,@Repository...);所以开发中常见的两种容器:AnnotationConfigApplicationContext与ClassPathXmlApplicationContext;两者的区别在于,获取bean的定义的方式不同:
- ClassPathXmlApplicationContext:是通过指定配置文件的路径去加载bean的定义信息,
- AnnotationConfigApplicationContext:通过指定的配置类去扫描范围内的所有类,然后加载bean的是定义信息
三、 Spring容器的创建过程源码分析
下面案例以AnnotationConfigApplicationContext的创建为例
-
创建AnnotationConfigApplicationContext实例
-
Spring容器的refresh()
-
prepareRefresh():刷新容器前的预处理
- AnnotationConfigApplicationContext.initPropertySources()
- AbstractApplicationContext.prepareRefresh() (1)initPropertySources() :初始化属性设置;
AnnotationConfigApplicationContext.initPropertySources()源码
这是一个空实现,也就是说这个方法是初始化子类自定义的初始化内容
(2)getEnvironment().validateRequiredProperties():检验属性是否合法
(3)earlyApplicationEvents= new LinkedHashSet<ApplicationEvent>():该集合是保存一些容器早起的一些时间【ApplicationEvent在《Spring系列(六)——Spring扩展原理》中有过讲解】
- AnnotationConfigApplicationContext.initPropertySources()
-
obtainFreshBeanFactory():获取BeanFactory
(1)refreshBeanFactory();刷新BeanFactory;
创建了一个this.beanFactory = new DefaultListableBeanFactory();设置id(源码如下)
(2)getBeanFactory();返回刚才GenericApplicationContext创建的BeanFactory对象
(3)返回BeanFactory; -
prepareBeanFactory(beanFactory):BeanFactory的预准备工作
-
postProcessBeanFactory(beanFactory):该方法是一个空实现,留给子类通过重写这个方法来在BeanFactory创建并预准备完成以后做进一步扩展设置
-
invokeBeanFactoryPostProcessors(beanFactory):执行BeanFactoryPostProcessor的方法 BeanFactoryPostProcessor是BeanFactory的后置处理器。执行时机是在该类初始化之后,更新应用容器中的bean工厂;此时所有bean的定义信息将被加载,但是却没有实例化的;后置通知设计到的接口:BeanFactoryPostProcessor、BeanDefinitionRegistryPostProcessor;其中实现BeanDefinitionRegistryPostProcessor的bean的方法为什么会在实现BeanFactoryPostProcessor的bean的方法执行之前
(1) PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors()):执行BeanFactoryPostProcessor的方法 -
registerBeanPostProcessors(beanFactory):注册BeanPostProcessor(Bean的后置处理器)
(1)不同的实现BeanPostProcessor子接口的Bean,在Bean创建前后的执行时机是不一样的;一下介绍
BeanPostProcessor的子接口:DestructionAwareBeanPostProcessor、InstantiationAwareBeanPostProcessor、SmartInstantiationAwareBeanPostProcessor、 MergedBeanDefinitionPostProcessor
(2)registerBeanPostProcessors(beanFactory)源码
(3)PostProcessorRegistrationDelegate.registerBeanPostProcessors(beanFactory, this)源码 -
initMessageSource();初始化MessageSource组件 (做国际化功能;消息绑定,消息解析)
-
initApplicationEventMulticaster():初始化事件派发器
-
onRefresh();是一个空实现,留给子容器重写这个方法,在容器刷新的时候可以自定义逻辑;
-
registerListeners():给容器中将所有项目里面的ApplicationListener注册进来
-
finishBeanFactoryInitialization(beanFactory);初始化所有剩下的单实例bean (特别重要)
(1)源码展示
(2)beanFactory.preInstantiateSingletons();初始化后剩下的单实例bean -
finishRefresh():完成BeanFactory的初始化创建工作;IOC容器就创建完成