Spring源码的描述

118 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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( ̄︶ ̄)(キ`゚Д゚´)!!