从spring最核心类refresh()讲起

94 阅读2分钟

0.总述

  • 创建一个对象并加入到spring容器的过程基本可以分为三个大的步骤,一是加载整个环境信息,二是加载各个bean的定义,接着就是创建对应的bean,放入ioc容器中。
  • spring创建bean最核心方法就是org.springframework.context.support.AbstractApplicationContext#refresh方法,这个方法完成了spring框架中bean的整个创建过程,包括前处理后处理,aop代理,bean创建完成或者修改后的通知等等,简简单单的一个方法就包罗万象,spring的ioc精髓全在其中

1.从方法中的方法说起--->refresh()

  • 总的逻辑还是没变,优先加载环境和配置,其次将优先级高的bean先放入容器,比如【BeanFactoryPostProcessor bean】【BeanPostProcessor bean】等等,在创建bean的时候将会使用这优先配置的bean对后续的bean进行处理

 ```
  synchronized (this.startupShutdownMonitor) {
         StartupStep contextRefresh = this.applicationStartup.start("spring.context.refresh");

         // Prepare this context for refreshing.
         // 1.为上下文的刷新做准备,包括设置【启动时间,上下文启动标志设置true,初始化环境属性以及验证必需属性
         // Local listeners registered 注册,earlyApplicationEvents事件重置
         prepareRefresh();

         // Tell the subclass to refresh the internal bean factory.
         // 告诉子类刷新内部 Bean 工厂
         // 存在工厂就关闭,重新新建一个,并加载解析并注册bean定义
         ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

         // Prepare the bean factory for use in this context.
         // bean工厂【类加载器设置、一些单例优先注册到容器中,一些BeanPostProcessor放入
         prepareBeanFactory(beanFactory);

         try {
             // Allows post-processing of the bean factory in context subclasses.
             // 子类覆盖方法做额外的处理,此处我们自己一般不做任何扩展工作,但是可以查看web中的代码是有具体实现的
             postProcessBeanFactory(beanFactory);

             StartupStep beanPostProcess = this.applicationStartup.start("spring.context.beans.post-process");
             // Invoke 【factory processors】 registered as beans in the context.
             // 实例化并调用所有注册的 BeanFactoryPostProcessor bean,如果给定,则遵守显式顺序。
             invokeBeanFactoryPostProcessors(beanFactory);

             // Register bean processors that intercept bean creation.
             // 实例化并注册所有 BeanPostProcessor bean,如果给定,则遵循显式顺序。
             registerBeanPostProcessors(beanFactory);
             beanPostProcess.end();

             // Initialize message source for this context.
             // 为上下文初始化message源,即不同语言的消息体,国际化处理,
             initMessageSource();

             // Initialize event multicaster for this context.
             // 初始化事件监听器多路广播器。如果上下文中未定义任何内容,则使用 SimpleApplicationEventMulticaster
             initApplicationEventMulticaster();

             // Initialize other special beans in specific context subclasses.
             // 留给子类来初始化其他的bean--springboot内置tomcat在这里实现了
             onRefresh();

             // Check for listener beans and register them.
             // 在所有注册的bean中查找listener bean,注册到消息广播器中
             registerListeners();

             // Instantiate all remaining (non-lazy-init) singletons.
             // 实例化剩下的单实例(非懒加载的)---》核心方法
             **finishBeanFactoryInitialization(beanFactory);**

             // Last step: publish corresponding event.
             // 发布相应事件
             finishRefresh();
         }
         ......
     }
  ```

2.从方法中的方法说起--->finishBeanFactoryInitialization()