spring容器初始化过程
1、通过newAnnotationConfigApplicationContext构造方法传入加了@Configuration的配置类
AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
2、AnnotationConfigApplicationContext构造方法主要有3个方法,spring容器的初始化就在这3行代码里
// 这里由于他有父类,故而会先调用父类(GenericApplicationContext)的构造方法,
// GenericApplicationContext主要是实例化一个beanFactory工厂
// 然后才会调用自己的构造方法
// 在自己的构造方法中初始一个读取器和扫描器
this();
// AnnotationConfigApplicationContext继承了GenericApplicationContext类,所以会先去初始化GenericApplicationContext的构造方法
// GenericApplicationContext类主要实例化了一个beanFactroy工厂
1) GenericApplicationContext#GenericApplicationContext() {
// 这个beanFactory类型为DefaultListableBeanFactory beanFactory
// 需要看DefaultListableBeanFactory的继承关系
// DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactory --> extends AbstractBeanFactory
// 在AbstractBeanFactoty抽象类中初始化beanFactory所需的各种原料如:
// List<BeanPostProcessor> beanPostProcessors,后置处理器
// Map<String, Scope> scopes,
// Map<String, RootBeanDefinition> mergedBeanDefinitions,bean的配置信息等
// 此时beanFactory已经准备完成
this.beanFactory = new DefaultListableBeanFactory();
}
// 紧接着走AnnotationConfigApplicationContext自己的构造方法
2) AnnotationConfigApplicationContext#AnnotationConfigApplicationContext() {
// 创建一个读取加了注解的Bean的定义,Bean的定义就是BeanDefinition类
// 这个类就是spring对bean的描述
this.reader = new AnnotatedBeanDefinitionReader(this);
--> 跟到AnnotationConfigUtils#registerAnnotationConfigProcessors();
---> 这里主要是向beanFactory工厂设置所需的各种原料,会向beanFactory工厂注册5个配置
----> org.springframework.context.annotation.internalConfigurationAnnotationProcessor 这个是最重要的
----> org.springframework.context.annotation.internalAutowiredAnnotationProcessor
----> org.springframework.context.annotation.internalCommonAnnotationProcessor
----> org.springframework.context.event.internalEventListenerProcessor
----> org.springframework.context.event.internalEventListenerFactory
---> 跟到DefalutListableBeanFactory#registerBeanDefinition();
到这个方法之后会向beanFactory工厂注册上面5个配置放到DefalutListableBeanFactory的beanDefinitionMap属性中
至此,spring本身需要的配置注册完成
// 在IOC容器中初始化一个 按类路径扫描注解bean的 扫描器
this.scanner = new ClassPathBeanDefinitionScanner(this);
// 这里的scanner没有实质性的作用,spring在reader中会自己new一个ClassPathBeanDefinitionScanner()对象
}
/**
* register方法重点完成了bean配置类本身的解析和注册,处理过程可以分为以下几个步骤:
* 1.根据bean配置类,使用BeanDefinition解析Bean的定义信息,主要是一些注解信息
* 2.Bean作用域的处理,默认缺少@Scope注解,解析成单例
* 3.借助AnnotationConfigUtils工具类解析通用注解
* 4.将bean定义信息已beanname,beandifine键值对的形式注册到ioc容器中
*/
register(annotatedClasses);
--> 代码最终跟到AnnotatedBeanDefinitionReader#doRegisterBean()方法
---> 首先创建一个注解元数据的数据结构类AnnotatedGenericBeanDefinition里面含有配置文件的一下元信息如beanClass,scope,lazyInit,primary...
---> 将填充好的AnnotatedGenericBeanDefinition元数据注册给registry,这个refistry就是AnnotationConfigApplicationContext
--> 跟到BeanDefinitionReaderUtils.registerBeanDefinition()方法的
registry.registerBeanDefinition(),这里会向beanFactory工厂注册自己的配置类AppConfig此时beanFactory工厂会有6个配置
---> org.springframework.context.annotation.internalConfigurationAnnotationProcessor 这个是最重要的
---> org.springframework.context.annotation.internalAutowiredAnnotationProcessor
---> org.springframework.context.annotation.internalCommonAnnotationProcessor
---> org.springframework.context.event.internalEventListenerProcessor
---> org.springframework.context.event.internalEventListenerFactory
---> appConfig 这个是自己的配置类
/**
* 刷新上下文
*/
refresh();
1) AbstractApplicationContext#refresh() // 这个方法会对beanFactory进行初始化
// 1.刷新前的预处理,不重要
prepareRefresh();
// 2.获取刷新后的内部Bean工厂,设置一个serializationId
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
//3.BeanFactory的预准备工作(重点)
prepareBeanFactory(beanFactory);
//配置其标准特征,比如上下文的加载器ClassLoader和post-processors回调,这里看源码
--> 跟进去到AbstractApplicationContext#prepareBeanFactory();
// 4.空方法,用于在容器的子类中扩展
postProcessBeanFactory(beanFactory);
// 在BeanFactory标准初始化之后执行的
// 调用 BeanFactoryPostProcessor 各个实现类的 postProcessBeanFactory(factory) 方法
// 5. 执行BeanFactoryPostProcessor的方法,BeanFactory的后置处理器,
//======================================
//-----------------重点------------------
//======================================
invokeBeanFactoryPostProcessors(beanFactory);
--> AbstractApplicationContext#refresh#invokeBeanFactoryPostProcessors()
// 这个类需要好好看看,暂时还是很了解
---> PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors()
// 注册 BeanPostProcessor 的实现类,注意看和 BeanFactoryPostProcessor 的区别
// 此接口两个方法: postProcessBeforeInitialization 和 postProcessAfterInitialization
// 两个方法分别在 Bean 初始化之前和初始化之后得到执行。注意,到这里 Bean 还没初始化
// 6. 注册BeanPostProcessor(Bean的后置处理器),用于拦截bean创建过程
registerBeanPostProcessors(beanFactory);
// 7. 初始化MessageSource组件(做国际化功能;消息绑定,消息解析)
initMessageSource();
// 8. 初始化事件派发器
initApplicationEventMulticaster();
// 9.空方法,可以用于子类实现在容器刷新时自定义逻辑
onRefresh();
// 10. 注册时间监听器,将所有项目里面的ApplicationListener注册到容器中来
registerListeners();
// 重点,重点,重点
// 初始化所有的 singleton beans
//(lazy-init 的除外)
// 11. 初始化所有剩下的单实例bean,单例bean在初始化容器时创建,
// 原型bean在获取时(getbean)时创建
//======================================
//-----------------重点------------------
//======================================
finishBeanFactoryInitialization(beanFactory);
// 12. 完成BeanFactory的初始化创建工作,IOC容器就创建完成;
finishRefresh();