持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第22天,点击查看活动详情
注解方式
源码的白话描述:
new AnnotationConfigApplicationContext(class.class);
创建一个注解配置的上下文,AnnotationConfigApplication()的构造函数;
this()
首先调用它的父类(GenerticApplicationContext)的构造方法,创建了一个应用上下文对象工厂(DefaultListableFactory);该工厂是属于最底层的工厂类实现,功能比较全;
接着new AnnotationBeanDefinitionReader()创建了一个读取注解bean定义的读取器
该读取器内主要是创建了一批spring内部使用的beandefinition(主要是一些注解的后置处理器例如ConfigurationClassPostProcessor,AutowiredAnnotationClassPostProcessor等等),把beandefinition存放在一个map里面,bean的名称存放在list里面;存到BeanDefinitionHolder里面;
register(annotatedClasses):
注册传入的配置类,该方法的参数是个数组,方法通过上一步的读取器循环内部数组注册bean定义;这里会把自定义的beandefiniton注册到Map里面去,name注册到list
refresh();刷新容器:
核心方法:
invokeBeanFactoryPostProcessors(beanFactory);
调用bean后置处理器加载class成beandefinition;
该方法首先判断传入的BeanFactory(此处是DefaultListableBeanFactory) 是否实现了BeanDefinitionRegistry(bean定义注册器),实现了该注册器的bean工厂就有注册和获取beandefinition的能力;
1、该方法首先把beabfactory强转成bean定义注册器,声明两个几个分别存储,BeanFactoryPostProcrssor和BeanDefinitionRegistryPostProcessor类型的两个集合;
2、然后是最先循环方法参数中传入的集合BeanFactoryPostProcessor,先处理这个集合 // TODO
3、接着是容器中的BeanDefinitionRegistryPostProcessor,声明一个这个类型的临时集合T;
首先是根据bean的类型,获得BeanDefinitionRegistryPostProcessor类型的bean的名称,得到一个数组,循环这个数组,先过滤出实现了PriorityOrdered接口的bean,然后根据bean的名称和类型通过getBean的方式获得bean添加到临时集合T;同时把已经处理了的bean名称添加到已处理的set几个 S;
4、然后是对临时集合T进行排序,添加到相对应类型的大集合中,然后调用invokBeanDefinitionRegistryPostProcessor处理当前临时集合中的后置处理器;之后立马清理掉当当临时集合;
类似的方式处理其他实现了PriorityOrdered接口的和没有实现优先级接口的,最后在分门别类的处理完成之后,统一调用invokeBeanFactoryPostProcessors处理上述已经处理过了的bean,此处需要注意的是只要是实现了BeanDefinitionRegistryPostProcessor肯定也实现了BeanFactoryPostProcessor;
interface BeanDefinitionRegistryPostProcessor extends BeanFactoryPostProcessor
接下来这个方法就是处理BeanFactoryPostProcessor类型的工厂后置处理器;
- 首先是获取到所有BeanFactoryPostProcessor类型的bean定义的名称;
- 然后是把上面逻辑中实现了BeanDefinitionRegistryPostProcessor的bean定义处理过了的过滤掉;skip;
- 声明三个集合,分别是实现了PriorityOrdered,PriorityOrdered和什么优先级都没得的集合;依照优先级的先后顺序执行;
- 同样是以getbean方法根据bean的名称和实现类型获取到当前的bean处理器,添加到上述对应的集合,调用invokeBeanFactoryPostProcessors处理;
- 下一节:invokBeanDefinitionRegistryPostProcessor和invokeBeanFactoryPostProcessors源码描述
O(∩_∩)O哈哈~ o( ̄︶ ̄)(キ`゚Д゚´)!!