spring源码阅读

一. 整体加载流程

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的定义。还可以给容器添加一些额外的组件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值