Spring注解(五)——————Spring容器加载的过程

关注微信公众号【行走在代码行的寻路人】获取Java相关资料,分享项目经验及知识干货。

以下测试的源码地址:https://github.com/877148107/Spring-Annotation

Spring容器创建过程:

refresh():【容器刷新】

  1. prepareRefresh();【刷新前的预处理】

    1. initPropertySources();初始化容器中的一些属性设置。提供给子类自定义个性化属性设置的方法

    2. getEnvironment().validateRequiredProperties();检验属性合法

    3. earlyApplicationEvents= new LinkedHashSet<ApplicationEvent>();保存容器中的一些早期的事件;

  2. obtainFreshBeanFactory();【获取BeanFactory】

    1. refreshBeanFactory();刷新创建beanFactory,并设置一个序列id

      new DefaultListableBeanFactory(getInternalParentBeanFactory());

    2. getBeanFactory();获取刚刚创建的BeanFactory对象,并返回

  3. prepareBeanFactory(beanFactory);BeanFactory的预备工作,进行一些设置

    1. 设置bean的类加载器。表达式解析器

    2. 添加BeanPostProcessor(ApplicationContextAwareProcessor)

    3. 设置一些忽略的自动装备接口EnvironmentAware、EmbeddedValueResolverAware、ResourceLoaderAware、MessageSourceAware等等

    4. 注册可以解析的自动装配,我们可以自定义实现这些接口注入组件

    5. 添加BeanPostProcessor(ApplicationListenerDetector)

    6. 注册默认的环境中能使用的bean:ConfigurableEnvironment、Map<String, Object>、

  4. postProcessBeanFactory(beanFactory);BeanFactory准备工作完成后进行的后置处理工作

    1. 子类通过重写这个方法来在BeanFactory创建并预准备完成以后做进一步的设置

  5. invokeBeanFactoryPostProcessors(beanFactory);执行BeanFactoryPostProcessor的方法

    1. 先判断BeanFactory是否是BeanDefinitionRegistry和BeanDefinitionRegistryPostProcessor类型的分别放入不同的list

    2. 获取所有bean类型为BeanDefinitionRegistryPostProcessor

      1. 执行实现PriorityOrdered。

        postProcessor.postProcessBeanDefinitionRegistry(registry);
      2. 执行实现Ordered

        postProcessor.postProcessBeanDefinitionRegistry(registry);
      3. 最后执行没有实现任何优先级接口的

        postProcessor.postProcessBeanDefinitionRegistry(registry);
    3. 再执行postProcessor.postProcessBeanFactory(beanFactory);

    4. 获取所有bean类型为BeanFactoryPostProcessor

      1. 先执行实现PriorityOrdered

        postProcessor.postProcessBeanFactory(beanFactory);
      2. 在执行实现Ordered

        postProcessor.postProcessBeanFactory(beanFactory);
      3. 最后执行没有实现任何优先级的接口

        postProcessor.postProcessBeanFactory(beanFactory);
  6. registerBeanPostProcessors(beanFactory);注册BeanPostProcessor(Bean的后置处理器)(拦截器bean的创建)

    1. 获取所有bean类型为BeanPostProcessor

    2. 先注册实现了PriorityOrdered接口的BeanPostProcessor

    3. 再注册实现了Ordered接口的BeanPostProcessor

    4. 最后注册没有实现任何优先级接口的BeanPostProcessor和MergedBeanDefinitionPostProcessor

    5. 注册一个ApplicationListenerDetector;来在Bean创建完成后检查是否是ApplicationListener

  7. initMessageSource();初始化MessageSource组件(做国际化功能;消息绑定,消息解析)

    1. 获取getBeanFactory()

    2. 看容器中是否有id为messageSource的,类型是MessageSource的组件;如果有赋值给messageSource,如果没有自己创建一个DelegatingMessageSource;MessageSource:取出国际化配置文件中的某个key的值;能按照区域信息获取;

    3. 把创建好的MessageSource注册在容器中,以后获取国际化配置文件的值的时候,可以自动注入MessageSource;

  8. initApplicationEventMulticaster();初始化事件派发器;

    1. 获取getBeanFactory()

    2. 从BeanFactory中获取applicationEventMulticaster的ApplicationEventMulticaster;

    3. 如果上一步没有配置;创建一个SimpleApplicationEventMulticaster

    4. 将创建的ApplicationEventMulticaster添加到BeanFactory中,以后其他组件直接自动注入

  9. onRefresh();容器刷新

    1. 子类重写方法在容器刷新的时候自定义逻辑

  10. registerListeners();注册监听器

    1. 从容器中拿到所有的ApplicationListener

    2. 将每个监听器都放入ApplicationEventMulticaster监听派发器里面

  11. finishBeanFactoryInitialization(beanFactory);初始化剩下的单实例bean

    1. 获取容器中所有的bean依次进行初始化和创建bean对象

      1. 获取bean定义信息RootBeanDefinition

      2. 判断是否是抽象、是否单实例、是否懒加载

      3. 判断bean是否是FactoryBean类型,不是bean工厂类型就getBean-doGetBean

      4. 从缓存中获取单实例bean,getSingleton(beanName),获取到直接返回

      5. 开始创建bean流程

        1. 获取bean定义信息RootBeanDefinition

        2. 获取bean依赖的bean先将它们创建

        3. createBean(beanName, mbd, args);

        4. Object bean = resolveBeforeInstantiation(beanName, mbdToUse);先拦截返回一个代理对象

          1. 先利用BeanPostProcessor执行postProcessBeforeInstantiation

          2. 再利用BeanPostProcessor执行postProcessAfterInitialization

        5. 没有代理对象开始创建doCreateBean

          1. createBeanInstance;创建一个bean实例

          2. 调用MergedBeanDefinitionPostProcessor的postProcessMergedBeanDefinition

          3. populateBean;给bean赋值

            1. 获取InstantiationAwareBeanPostProcessor执行postProcessAfterInstantiation

            2. 获取InstantiationAwareBeanPostProcessor执行postProcessPropertyValues

            3. applyPropertyValues(beanName, mbd, bw, pvs)应用Bean属性的值;为属性利用setter方法等进行赋值;

          4. initializeBean(beanName, exposedObject, mbd);初始化Bean

            1. invokeAwareMethods(beanName, bean);执行执行Aware接口方法

            2. 执行后置处理初始化之前的方法applyBeanPostProcessorsBeforeInitialization:beanProcessor.postProcessBeforeInitialization(result, beanName);

            3. invokeInitMethods(beanName, wrappedBean, mbd);调用初始化方法

            4. 执行后置处理器初始化之后的方法applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);beanProcessor.postProcessAfterInitialization(result, beanName);

          5. registerDisposableBeanIfNecessary(beanName, bean, mbd);注册并创建bean销毁方法

  12. finishRefresh();完成BeanFactory的初始化创建工作;IOC容器就创建完成

    1. initLifecycleProcessor();初始化和生命周期有关的后置处理器;LifecycleProcessor

    2. 默认从容器中找是否有lifecycleProcessor的组件【LifecycleProcessor】;如果没有new DefaultLifecycleProcessor(); 加入到容器

    3. 拿到前面定义的生命周期处理器(BeanFactory);回调onRefresh();

    4. publishEvent(new ContextRefreshedEvent(this));发布容器刷新完成事件;

  13. 总结

    1. Spring容器在启动的时候,会先保持所有注册进来的bean的定义信息(xml配置和注解的bean)

    2. Spring容器会在适当的时候创建这些bean,用到这个bean的时候getBean创建Bean,并保持在容器中,然后统一创建剩下的所有bean(finishBeanFactoryInitialization)

    3. BeanPostProcessor后置处理器(重要)

      1. 每个bean创建完成后都会获取容器中的所有后置处理器进行处理来增强这些bean功能。比如:AnnotationAwareAspectJAutoProxyCreator来实现AOP功能的、AutowiredAnnotationBeanPostProcessor来实现自动注入的、等等xxxBeanPostProcessor

发布了101 篇原创文章 · 获赞 10 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/WMY1230/article/details/103395885