深入理解SpringIOC(一)---Ioc容器初始化的流程

引言:

什么是IOC容器?

beanDefinitionMap,singletonObjects(单例缓冲池),PostProcessor(后置处理器)等一系列来完成springIOC核心功能的组件。而不仅仅指的是singletonObjects(单例缓冲池)。

Ioc容器初始化的流程

当我们在应用程序中使用Spring框架的时候,我们需要得到一个spring上下文,并从中得到我们需要的bean.那么spring是如何帮我们创建对象的呢?下面就让我们来看一看ioc容器初始化的流程

AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(simpleConfig.class);

ctx.getBean("cat");

但我们在使用spring框架后,只需要应用程序中配置一系列注解(XML也可以,不过现在应该都是注解了吧),然后在Main方法中写上以上这行代码,得到一个spring上下文,然后就可以通过getBean()方法得到我们想要的对象。

下面让我们进入AnnotationConfigApplicationContext(simpleConfig.class)看看ioc容器是如何进行初始化的。

在这里插入图片描述

IOC初始化流程图在这里插入图片描述

this()

public AnnotationConfigApplicationContext() {

   //初始化注解模式下的Bean定义扫描器
   this.reader = new AnnotatedBeanDefinitionReader(this);
   //初始化ClassPath类型的Bean定义扫描器
   this.scanner = new ClassPathBeanDefinitionScanner(this);
}

register(annotatedClasses)

register的作用将Spring必须的六大配置类和加了Configuration注解类实例化并放入beanDefinitionMap中
在这里插入图片描述

refresh()

public void refresh() throws BeansException, IllegalStateException {
   Object var1 = this.startupShutdownMonitor;
   synchronized(this.startupShutdownMonitor) {

      //刷新容器前的准备(开始时间/启动标志等)
      this.prepareRefresh();

      //刷新BeanFactory
      ConfigurableListableBeanFactory beanFactory = this.obtainFreshBeanFactory();

      //配置类的标准属性(类加载器之类的)
      this.prepareBeanFactory(beanFactory);

      try {
      
        /*
	* spring中并没有具体去实现postProcessBeanFactory方法,是提供给想要实现BeanFactoryPostProcessor的三方框架使用的。谁要使用谁就去        实现。
	* 作用是在BeanFactory准备工作完成后做一些定制化的处理,实现BeanPostProcessor接口的使用,注入一些重要资源,或修改Bean的行为,
	* 得到beanFactory,为所欲为!
	*/
          this.postProcessBeanFactory(beanFactory);

         //找到所有的BeanFactoryPostProcessor并执行他们的方法
         /*
          原理:从容器中获取获取到所有的BeanDefinitionRegistryPostProcessor组件,然后依次触发所有的postProcessBeanDefinitionRegistry()方法,
         再来从容器中找到BeanFactoryPostProcessor组件,然后依次触发所有的postProcessBeanFactory()方法。
        */         
         this.invokeBeanFactoryPostProcessors(beanFactory);

         //注册BeanPostProcessor
         this.registerBeanPostProcessors(beanFactory);

         //初始化initMessageSource组件,用于国际化等
         this.initMessageSource();

         //初始化自定义事件广播器
         this.initApplicationEventMulticaster();

         //初始化其它的特殊bean(子类增强器)
         this.onRefresh();

         //注册监听器
         this.registerListeners();

         //初始化Spring单例Bean  ----》完成bean的一系列装配
         this.finishBeanFactoryInitialization(beanFactory);

         //完成初始化,发布初始化事件
         this.finishRefresh();
      } catch (BeansException var9) {
         if (this.logger.isWarnEnabled()) {
            this.logger.warn("Exception encountered during context initialization - cancelling refresh attempt: " + var9);
         }

         this.destroyBeans();
         this.cancelRefresh(var9);
         throw var9;
      } finally {
         this.resetCommonCaches();
      }

   }
}

思考

1. 为什么创建DefaultListableBeanFactory而不是其它的BeanFactory?

在这里插入图片描述
继承了所有BeanFactory,功能最全。

2. BeanFactory和ApplicationContext的关系?

组合关系,ApplicationContext在BeanFactory的基础上扩展了很多功能
在这里插入图片描述

发布了45 篇原创文章 · 获赞 3 · 访问量 2312

猜你喜欢

转载自blog.csdn.net/weixin_44046437/article/details/99763395
今日推荐