美文网首页
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