美文网首页
AnnotationConfigApplicationConte

AnnotationConfigApplicationConte

作者: 一生逍遥一生 | 来源:发表于2020-05-02 00:02 被阅读0次

本文参考的spring版本为5.2.6.RELEASE

this()方法

1.获取DefaultListableBeanFactory对象
2.注册PostProcessor

  • org.springframework.context.annotation.internalConfigurationAnnotationProcessor
  • org.springframework.context.annotation.internalAutowiredAnnotationProcessor
  • org.springframework.context.annotation.internalCommonAnnotationProcessor(支持JSR-250)
  • org.springframework.context.annotation.internalPersistenceAnnotationProcessor(支持JPA)
  • org.springframework.context.event.internalEventListenerProcessor
  • org.springframework.context.event.internalEventListenerFactory
    3.注册默认filter
  • @Component以及衍生注解
  • JSR-250
  • JSR-330
    4.设置环境变量
    5.设置资源加载器

register()方法

1.拿到被注解类的信息
2.是否要跳过@Conditional修饰的:如果没有被@Conditional修饰,并且存在注解信息,直接跳过
3.添加回掉
4.判断ScopeMetaData,来判断是否为单例
5.如果bean没有名字,自动生成
6.处理通用注解:@Lazy、@Primary、@DependOn、@Description、@Role
7.判断@Qualifer、customizers(bean定义的定制化)
8.设置Scope代理模式
9.将配置类进行注册

scan()方法

按照提供的扫描包的根目录,直接扫描当前的根目录以及子目录。
再处理的过程,判断这个类是一个普通bean,还是添加一些注解的bean,例如:@Lazy、@Primary、@DependOn、@Description、@Role
在处理之后添加,进行注册。如果对象是单例模型,就会创建出来,如果不是就不会创建出来

refresh方法

*1.prepareRefresh()刷新钱的处理

  • a.initPropertySources()初始化一些属性设置;子类自定义个性化的设置方法;
  • b.getEnvironment().validateRequiredProperties();校验属性的合法等。
  • c.earlyApplicationEvents = new LinkedHashSet<ApplicationEvent>();容器中的一些早期的事件;
  • 2.obtainBeanFactory:获取beanFactory
    • a.refreshBeanFactory:刷新BeanFactory
    • b.getBeanFactory:返回GenericApplicationContext创建的BeanFactory。
    • c.将创建的DefaultListableBeanFactory返回。
    1. prepareBeanFactory:
    • a.设置BeanFactory的类加载、支持表达式解析器
    • b.添加部分BeanPostProcessor[ApplicationContextAwareProcessor]
    • c.设置忽略自动装配的接口EnvironmentAware。
    • d.注册可以解析的自动装配:BeanFactory、ResourceLoader、ApplicationEventPublisher。
    • e.添加BeanPostProcessor[ApplicationListenDetector]
    • f.添加编译时aspectj
    • g.给BeanFactory注册一些能用的组件:environment[ConfigurableEnvironment]、systemProperties、systemEnvironment。
    1. postProcessBeanFactory: 子类自定义实现
    1. invokeBeanFactoryPostProcessor:执行BeanFactoryPostProcessor
    • a.执行BeanFactoryPostProcessord的方法;
      • a.1. 获取所有的BeanDefinitionRegistryPostProcessor;
      • a.2. 先执行实现PriorityOrdered接口的BeanDefinitionRegistryPostProcessor;
      • a.3. 先执行实现Ordered接口的BeanDefinitionRegistryPostProcessor;
      • a.4 执行没有排序的BeanDefinitionRegistryPostProcessor;
      • 执行postProcessBeanDefinitionRegistry
    • b.执行BeanFactoryPostProcessor
      • b.1 获取所有的BeanFactoryPostProcessor
      • b.2.先执行实现PriorityOrdered接口的BeanFactoryPostProcessor;
      • b.3 先执行实现Ordered接口的BeanFactoryPostProcessor;
      • b.4 无序的BeanFactoryPostProcessor;
      • 执行postProcessBeanFactory。
    1. registerBeanPostProcessor(beanFactory):拦截bean的创建过程
    • 获取所有的BeanPostProcessor
    • 按照PriorityOrdered、Ordered、无序方式来注册BeanPostProcessor
    • 最终注册MergedBeanDefinitionPostProcessor。
    • 注册一个ApplicationListenerDetector:在Bean创建完成之后检查是否是ApplicationListener,如果是,直接注册
    1. initMessageSource:初始化国际化组件
    • 获取BeanFactory,
    • 看容器中是否有id为messageSource的组件。如果有,直接赋值;如果没有,自己创建。
    • 将创建好的messagesource注册到容器中,以后获取国际化配置文件的值,可以自动注入MessageSource。
    1. initApplicationEventMulticaster:初始化派发器
    • 如果有自定义的,就是用自定义的
    • 如果没有自定义的,使用默认的ApplicationEventMulticaster。
  • 9.onRefresh: 留给子类重写刷新逻辑。
  • 10.registerListener:注册监听器
  • 11.finishBeanFactoryInitialization:初始化剩下的bean
    • a.preInstantiateSingleton: 初始化剩下的单例bean
      • 获取容器中所有的bean,以此进行初始化和创建对象
      • 获取bean的bbean的定义信息
      • bean不是抽象的,是单例的,是懒加载
        • 判断是否为FactoryBean,获取其派生类
        • 不是工厂,利用getBean创建对象
          • getBean
          • doGetBean
          • 先判断单例bean是否存在与缓存
          • 如果存在,就不处理,如果不能存在,就创建
          • 标记bean正在创建
          • 获取bean的定义信息
          • 获取当前bean依赖的其他bean,然后执行getbean流程
          • 启动单实例bean的创建流程
            • createBean
            • resolveBeforeInstantiation: 让BeanPostProcessor先返回代理对象
            • InstantiationAwareBeanPostProcessor:提前执行;先触发postProcessorBeforeInstantiation(),如果有返回,触发postProcessorAfterInstantiation()
            • 如果InstantiationAwareBeanPostProcessor没有返回对象,调用下面一步
            • Object beanInstance = doCreateBean(beanName,mdbToUse,rgs);
              • 利用工厂方法或者构造函数创建bean实例。
              • 调用mergedBeanDefinitionPostProcessor。
              • populateBean:属性赋值
            • bean初始化
              • 执行Aware接口
              • 执行后置处理器初始化之前
              • 执行初始化方法
              • 执行后置处理器初始化之后
            • 注册bean的销毁方法
          • 将创建的bean放入到singletonObjects中。
        • 所有bean利用getBean创建完成
          • 检查所有的Bean是否是SmartInitializationSingleton的接口,如果是,执行afterSingletonInitializations()。
  • 12.finishRefresh():完成BeanFactory的初始化创建工作,IOC容器创建完成。

相关文章

网友评论

      本文标题:AnnotationConfigApplicationConte

      本文链接:https://www.haomeiwen.com/subject/ezqhghtx.html