spring源码笔记(二)

先贴一张BeanFactory工厂的初始化的过程图,如下:

1,第一步,我们通过new AnnotationConfigApplicationContext(AppConfig.class)实例化一个上下文对象,在实例化上下文对象的之前,会先调用它继承的父类的构造方法,它的父类是GennericApplicationContext,父类GennericApplicationContext只做了一件事,实例化了bean工厂,this.beanFactory = new DefaultListableBeanFactory();。接着回到AnnotationConfigApplicationContext的构造方法,它实例化了一个AnnotatedBeanDefinitionReader,那么AnnotatedBeanDefinitionReader在实例化的过程中又做了什么呢?

2.第二步,AnnotatedBeanDefinitionReader实例化是调用了有参构造方法,它传入了一个BeanDefinitionRegistry实例,它是用来注册bd的,这个实例其实就是我们刚刚需要实例化的AnnotationConfigApplicationContext,因为AnnotationConfigApplicationContext实现了BeanDefinitionRegistry的接口,具体来讲是AnnotationConfigApplicationContext的父类实现了BeanDefinitionRegistry接口。接下来AnnotatedBeanDefinitionReader构造方法中调用了this(registry,getOrCreateEnvironment(registry));方法。接着它委托AnnotationConfigUtils类调用静态方法,AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry);然后AnnotationConfigUtils又调用内部方法registerAnnotationConfigProcessors(registry,null),那么这个方法做了那些事呢=======>

   a.添加了AnnotationAwareOrderComparator类对象,并添加到Beanfactory的属性中,这个对象的主要作用是通过解析@Order和@Priority的注解,实现类的加载排序

   b.添加了ContextAnnotationAutowireCandidateResolver的类对象,它的主要作用是提供延迟加载的功能

   c.往BeanDefinitionMap中注册一些spring内部定义的BeanDefinitionRegistryPostProcessor,注册这些的目的是在执行invokeBeanFactoryPostProcessors()方法时需要用到,invokeBeanFactoryPsotProcessors主要用于在beanFactory初始化的过程中去做一些事情?

  委托多个实现了BeanDefinitionRegistryPostProcessor或者BeanFactoryProcessor接口的类来做这些事情,如果不添加就没办法执行,主要注册了以下6个实现了类

    org.springframework.context.annotation.ConfigurationClassPostProcessor

    org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor

    org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor

    org.springframework.context.annotation.CommonAnnotationBeanPostProcessor

    org.springframework.context.event.EventListenerMethodProcessor

    org.springframework.context.event.DefaultEventListenerFactory

3.在AnnotationConfigUtils又是如何完成BeanDefinitionRegistryPostProcessor的注册的呢?首先调用AnnotationConfigUtils内部方法registerPostProcessor()====>然后调用我们传入的registry,调用registry.registerBeanDefinition(beanName,definition)================》this.beanFactory.registerBeanDefinition(beanName,beanDefinition)=======》this.beanDefinitionMap.put(beanName, beanDefinition);,把它放到BeanDifinitionMap当中去,如下

 

 

 

 

4.接着我们回到AbstractApplicationContext#refresh这里,这个方法主要做了这么几件事:

  执行prepareRefresh()方法,这个方法主要是设置启动时间,是否激活标识位,初始化属性源(property source)配置;

  执行obtainFreshBeanFactory返回一个beanFactory实例

       执行prepareBeanFactory()方法,这个方法又做了那些操作呢?

           a.添加一个类加载器

   b.添加bean表达式解释器,为了能够让我们的beanFactory去解析bean表达式

     c.添加了ResourceEditorRegistrar实例,主要是为了便于对象与字符串类型的转换

   d.添加一个后置处理器ApplicationContextAwareProcessor

     e.添加自动注入别忽视的列表

     f.添加了一个ApplicationListenerDetector后置处理器

       执行postProcessBeanFactory,目前没有任何实现,留给后面的版本实现

  执行invokeBeanFactoryPostProcessors(beanFactory)====>PostProcessorRegistrationDelegate#invokeBeanFactoryPostProcessors(),这个方法的具体逻辑是,循环List里的所有的BeanFactoryPostProcessor,根据条件判断该实例实现了                      BeanFactoryPostProcessor还是实现了BeanDefinitionRegistryPostProcessor,BeanDefinitionRegistryPostProcessor是BeanFactory的扩展接口,它在BeanFactory的基础上添加了一个postProcessBeanDefinitionRegistry()方法,在invokeBeanFactoryPostProcessors()方法里,定义了两个list,一个list用来存放实现了BeanDefinitionRegistryPostProcessor,并且回调了扩展方法postProcessBeanDefinitionRegistry()

      接着调用回调方法postProcessBeanDefinitionRegistry()=======》processConfigBeanDefinitions()=====》ConfigurationClassUtils#checkConfigurationClassCandidate,这个方法主要获取bd的元数据(类的信息),判断是否添加了@Configuration注解,是否添加了Component,ComponentScan,Import,ImportResource注解。接着回到processConfigBeanDefinitions()方法,org.springframework.context.annotation.ConfigurationClassParser#parse(java.util.Set<org.springframework.beans.factory.config.BeanDefinitionHolder>)使用这个方法扫描包,====》调用parse()===>org.springframework.context.annotation.ConfigurationClassParser#processConfigurationClass====>doProcessConfigurationClass====>ComponentScanAnnotationParser#parse=====>ClassPathBeanDefinitionScanner#doScan=======>ClassPathBeanDefinitionScanner#doScan=====>ClassPathScanningCandidateComponentProvider#scanCandidateComponents

 

 

 

posted @ 2021-01-16 20:50  shawdown  阅读(80)  评论(0)    收藏  举报