一. 整体加载流程
AnnotationConfigApplicationContext
1.this()->(1)父类GenericApplicationContext空参构造方法--->new DefaultListableBeanFactory()
(2)该类空参构造方法:new AnnotatedBeanDefinitionReader:bd读取器 ---> registerAnnotationConfigProcessors(完成spring内部bean definition的注册)
① beanFactory.setDependencyComparator(),主要用于排序(解析order注解和priority注解))
② beanFactory.setAutowireCandidateResolver(),提供延迟加载功能
③ 注册spring内部beanDefinition:ConfigurationClassPostProcessor,CommonAnnotationBeanPostProcessor等7个beanDefinition到
(3)该类空参构造方法:new ClassPathBeanDefinitionScanner:扫描包或类,转为beandefinition
2.this.register(annotatedClasses);--->reader.register(annotatedClasses):调用上面reader的doRegisterBean()方法
(1)new BeanDefinition(class)
(2)shouldSkip()判断是否跳过解析
(3)resolveScopeMetadata(abd):得到类的作用域并添加到abd中
(4)generateBeanName()生成类名
(5)processCommonDefinitionAnnotations:处理类中通用注解 (Primary Lazy等)
(6)registerBeanDefinition:把BeanDefinitionHolder注册到DefaultListableBeanFactory这个工厂
3.this.refresh()
(1)prepareRefresh():准备工作,设置启动事件,是否激活标识位
(2)obtainFreshBeanFactory():得到bean工厂
(3)prepareBeanFactory(beanFactory):准备bean工厂
(4)invokeBeanFactoryPostProcessors(beanFactory);
(5)registerBeanPostProcessors:注册beanPostProcessor
(6)initMessageSource():国际化语言的支持
(7)initApplicationEventMulticaster():初始化事件广播器
(8)onRefresh():当前版本没实现,后续可能拓展
(9)registerListeners():注册监听器。发布事件的时候会从这里注册的监听器中获取
(10)finishBeanFactoryInitialization:实例化所有bean
二.spring 内部bean
1.ConfigurationClassPostProcessor,:是一个工厂后置处理器,基本上类上面的注解都在这里面判断并解析
2.AutowiredAnnotationBeanPostProcessor:处理@autowired,是一个bean的后置处理器,在bean属性注入的时候会用到
3.RequiredAnnotationBeanPostProcessor:处理@required注解,它是一个bean的后置处理器,在bean属性注入的时候会用到
4.CommonAnnotationBeanPostProcessor:处理一些公共注解,它是一个bean后置处理器,可以处理@PostConstruct和@PreDestroy还有@Resource等
5.PersistenceAnnotationBeanPostProcessor:这是对jpa的处理,所以需要引入spring-orm的包,没有引入的话则spring不会注册这个类
6.EventListenerMethodProcessor:@EventListener注解的处理,spring实现事件监听的方式有很多种,其中一种就是在方法上添加@EventListener注解
7.DefaultEventListenerFactory:也是和Listener相关的
三.fresh()的prepareBeanFactory(beanFactory)准备bean工厂
(1)setBeanClassLoader:设置beanFactory类加载器
(2)setBeanExpressionResolver:设置bean表达式解析器,让beanfactory能解析bean的表达式 类似@Value("#{}")与@Value("${}")
(3)addPropertyEditorRegistrar:设置属性编辑器 (比如读取properties的值赋值到属性上)
(4)addPropertyEditorRegistrar():对象与string类型的转化
(5)beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this)):添加后置处理器ApplicationContextAwareProcessor,意思是当bean实现了以上的*Aware接口,通过setter方法会得到对应的属性参数
(6)beanFactory.registerResolvableDependency(BeanFactory.class, beanFactory):注册几个自动装配相关的类和实例
(7)beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(this)):添加一个BPP,处理时间监听器。在bean初始化完成后判断是不是监听器,是的话将它注册到应用的事件多播器上
四.fresh()的invokeBeanFactoryPostProcessors(beanFactory)
PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors())
invokeBeanFactoryPostProcessors在上下文中调用注册为bean的工厂处理器
(1)getBeanFactoryPostProcessors获取自定义的beanFactoryPostProcessor,就是不通过注解形式扫描获取,而是通过手动context.addBeanFactoryPostProcessor()完成自定义
(2)invokeBeanFactoryPostProcessors从beanFactory中获得所有类型为BeanDefinitionRegistryPostProcessor的beanDefinition的beanName,然后通过beanName获取beanDefinition并被添加进currentRegistryProcessors中,最后开始执行currentRegistryProcessors
(3)invokeBeanDefinitionRegistryPostProcessors--->processConfigBeanDefinitions(registry) 处理所有注册的bd ①判断是否spring默认的BeanDefinition ②判断当前BeanDefinition是否存在@Configuration注解 ③处理@PropertySource,把资源文件读取到上下文环境中去 ④处理@ComponentScan⑤处理@Import ⑥处理@Bean
五.refresh的registerBeanPostProcessors(beanFactory)
注册beanPostProcessor
(1)spring默认的3个类型为BeanPostProcessor的bd:AutowiredAnnotationBeanPostProcessor,RequiredAnnotationBeanPostProcessor,CommonAnnotationBeanPostProcessor
(2)可以自定义bd(需要添加元注解,能够被扫描注册进容器)实现BeanPostProcessor接口,这时候postProcessorNames就会出现自定义bd的beanName.通过@Enable注解导入,例如我在测试aop时用到了@EnableAspectJAutoProxy、@EnableAsync注解
六.BeanFactoryPostProcessor和BeanDefinitionRegistryPostProcessor
beandefinitionRegistryPostProcessor是BeanFactoryPostProcessor的子类。
除了能和BeanFactoryPostProcessor一样在实例化前改变bean的定义。还可以给容器添加一些额外的组件