学习spring流程,脉络梳理-含源码及注释

PostProcessor?

PostProcessor (增强器 后置处理器) ,BeanFactoryPostProcessor 完成对 Beanfactory 相关信息的修改或者扩展,BeanPostProcessor 完成对 bean 的修改或者扩展。

 

Bean的生命周期

取自BeanFactory接口代码注释

* <p>Bean factory implementations should support the standard bean lifecycle interfaces
* as far as possible. The full set of initialization methods and their standard order is:
* Bean工厂实现应该尽可能地支持标准bean lifecycle接口,所有实例方法和他们的标准排序如下
* <ol>
* <li>BeanNameAware's {@code setBeanName}
* <li>BeanClassLoaderAware's {@code setBeanClassLoader}
* <li>BeanFactoryAware's {@code setBeanFactory}
* <li>EnvironmentAware's {@code setEnvironment}
* <li>EmbeddedValueResolverAware's {@code setEmbeddedValueResolver}
* <li>ResourceLoaderAware's {@code setResourceLoader}
* (only applicable when running in an application context)
* <li>ApplicationEventPublisherAware's {@code setApplicationEventPublisher}
* (only applicable when running in an application context)
* <li>MessageSourceAware's {@code setMessageSource}
* (only applicable when running in an application context)
* <li>ApplicationContextAware's {@code setApplicationContext}
* (only applicable when running in an application context)
* <li>ServletContextAware's {@code setServletContext}
* (only applicable when running in a web application context)
* <li>{@code postProcessBeforeInitialization} methods of BeanPostProcessors
* <li>InitializingBean's {@code afterPropertiesSet}
* <li>a custom init-method definition
* <li>{@code postProcessAfterInitialization} methods of BeanPostProcessors
* </ol>

脉络总览

 

分步骤讲解

关键方法 ApplicationContext.refresh();

refresh 方法

@Override
public void refresh() throws BeansException, IllegalStateException {
    //startupShutdownMonitor对象在spring环境刷新和销毁的时候都会用到,确保刷新和销毁不会同时执行
    synchronized (this.startupShutdownMonitor) {
        // 准备工作,例如记录事件,设置标志,检查环境变量等,并有留给子类扩展的位置,用来将属性加入到applicationContext中
        prepareRefresh();

        // 创建beanFactory,这个对象作为applicationContext的成员变量,可以被applicationContext拿来用,
        // 并且解析资源(例如xml文件),取得bean的定义,放在beanFactory中
        ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

        // 对beanFactory做一些设置,例如类加载器、spel解析器、指定bean的某些类型的成员变量对应某些对象等
        prepareBeanFactory(beanFactory);

        try {
            // 子类扩展用,可以设置bean的后置处理器(bean在实例化之后这些后置处理器会执行)
            postProcessBeanFactory(beanFactory);

            // 执行beanFactory后置处理器(有别于bean后置处理器处理bean实例,beanFactory后置处理器处理bean定义)
            invokeBeanFactoryPostProcessors(beanFactory);

            // 将所有的bean的后置处理器排好序,但不会马上用,bean实例化之后会用到
            registerBeanPostProcessors(beanFactory);

            // 初始化国际化服务
            initMessageSource();

            // 创建事件广播器
            initApplicationEventMulticaster();

            // 空方法,留给子类自己实现的,在实例化bean之前做一些ApplicationContext相关的操作
            onRefresh();

            // 注册一部分特殊的事件监听器,剩下的只是准备好名字,留待bean实例化完成后再注册
            registerListeners();

            // 单例模式的bean的实例化、成员变量注入、初始化等工作都在此完成
            finishBeanFactoryInitialization(beanFactory);

            // applicationContext刷新完成后的处理,例如生命周期监听器的回调,广播通知等
            finishRefresh();
        }

        catch (BeansException ex) {
            logger.warn("Exception encountered during context initialization - cancelling refresh attempt", ex);

            // 刷新失败后的处理,主要是将一些保存环境信息的集合做清理
            destroyBeans();

            // applicationContext是否已经激活的标志,设置为false
            cancelRefresh(ex);

            // Propagate exception to caller.
            throw ex;
        }
    }
}

1、创建 BeanFactory 容器

2、加载配置文件,解析 Bean 定义信息,包装成 BeanDafination

BeanDifinationConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
--> refreshBeanFactory();
  --> try{
      // 创建 DefaultListableBeanFactory 对象
      DefaultListableBeanFactory beanFactory = createBeanFactory();
      // 为了序列化指定 id,可以从id反序列化到 BeanFactory 对象
      beanFactory.setSerializationId(getId());
      // 定制 beanFactory,设置相关属性,包括是否允许覆盖同名称的不同定义的对象以及循环依赖
      customizeBeanFactory(beanFactory);
      // 初始化 documentReader,并进行 XML 文件读取及解析,默认命名空间的解析,自定义标签的解析
      loadBeanDefinitions(beanFactory);
      this.beanFactory = beanFactory;
     }

在 obtainFreshBeanFactory() 方法中,先创建了一个 DefaultListableBeanFactory,再向其中设置一些基本属性,后通过 loadBeanDifinations(beanFactory) 将自定义的对象加入到 beanDifinationMap 中,在 map 中完成将每一个对象包装成 BeanDifination;

 

3、执行 BeanFactoryPostProcesser

invokeBeanFactoryPostProcessors(beanFactory);

执行后,BeanDifination 已经确定。

 

4、准备工作:准备 BeanPostProcesser,广播器,监听器

initApplicationEventMulticaster();
registerListeners();

初始化当前应用的事件广播器

注册监听器

 

5、实例化操作

6、初始化操作

finishBeanFactoryInitialization(beanFactory);
--> beanFactory.preInstantiateSingletons();
  --> // 将所有的 beanDefinitionNames 创建一个集合
     List<String> beanNames = new ArrayList<>(this.beanDefinitionNames);
     // 触发所有非延迟加载单例 bean 的初始化,遍历集合的对象
     for () {
       ...
       getBean(beanName);
       --> doGetBean(name, null, null, false);
          --> // bean 对象实现 FactoryBean 接口后会变成 &beanName
            String beanName = transformedBeanName(name);
            Object bean;
            // 提前检查单例缓存中是否有手动注册的单例对象,跟循环依赖有关联
            Object sharedInstance = getSingleton(beanName);
            if (sharedInstance != null && args == null) {
              ...
            } else {
              createBean(beanName, mbd, args);
              --> Object beanInstance = doCreateBean(beanName, mbdToUsc, args);
                 --> instanceWrapper = createBeanInstance(beanName, mbd, args);
                   --> Constructor<?> ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName);
                      // 使用默认无参构造函数创建对象,如果没有无参构造且存在多个有参构造且没有 @AutoWired 注解构造,会报错
                      return instantiateBean(beanName, mbd);
                      --> beanInstance = getInstantiationStrategy().instantiate(mbd, beanName, this);
                        --> constructorToUse = clazz.getDeclaredConstructor();
                           return BeanUtils.instantiateClass(constructorToUse);
                           --> return ctor.newInstance(argsWithDefaultValues);
              // 初始化过程 填充属性
              populateBean(beanName, mbd, instanceWrapper);
              // 执行初始化逻辑
              exposedObject = initializeBean(beanName, exposedObject, mbd);
              --> // Aware 接口处理器,调用 BeanNameAware、BeanClassLoaderAware、beanFactoryAware
                 invokeAwareMethods(beanName, bean);
                 // 将 BeanPostProcessors 应用到给定的现有 Bean 实例,调用它们的postProcessBeforeInitialization 初始化方法。
                 wrappedBean = applyBeanPostProcessorBeforeInitialization(wrappedBean, beanName);
                 // 调用初始化方法,先调用 bean 的 InitializingBean 接口方法,后调用 bean 的自定义初始化方法
                 invokeInitMethods(beanName, wrappedBean, mbd);
                 // 将 BeanPostProcessors 应用到给定的现有 Bean 实例,调用它们的 postProcessAfterInitialization方法
                 wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
            }
     }

实例化所有 剩余的 非懒加载的 单例对象

Aware接口是方便自定义对象获取到容器对象

 

7、获取对象

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值