zoukankan      html  css  js  c++  java
  • Spring回调接口之InstantiationAwareBeanPostProcessor

    概述

    org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor

    这个回调接口中有两个方法:

    @Nullable
    default Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
        return null;
    }
    default boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
    	return true;
    }
    

    这两个方法分别有什么用?

    postProcessBeforeInstantiation

    在bean实例化之前,传入该bean的class对象和beanName,如果我们返回的Object不为空,那么则说明这个类不需要Spring实例化且后序自动装配、bean初始化回调等都不会被执行等(但注意会去执行BeanPostProcessor的after初始化方法),相当于是在Spring准备初始化之前,如果该类返回不为空,那么后序所有事情都不会进行,Spring认为这个Bean已经是完整的bean了,所以它不会进行其他操作了。但注意这个Bean仍然会被放到Spring容器中去

    postProcessAfterInstantiation

    当Spring创建完Bean以后,进行自动装配以前,调用此回调,如果此方法中返回false,那么Spring则不会对这个bean进行自动装配(也就是属性注入)的操作。

    源码解析

    首先看postProcessBeforeInstantiation

    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#createBean(java.lang.String, org.springframework.beans.factory.support.RootBeanDefinition, java.lang.Object[])方法中

    注意看下一个红框里面的doCreateBean方法做完后,bean就被初始化创建且属性已注入,在此之前上一个红框中。

    resoleveBeforeInstantiation方法的返回值如果不为空,那么则直接return,后序的doCreateBean就没进入了。

    那么我们此处看看上面红框中的方法。

    1、Object bean = resolveBeforeInstantiation(beanName, mbdToUse);

    第一个红框中就是去执行InstantiationAwareBeanPostProcessor的postProcessBeforeInstantiation方法,第二个红框中就是去执行BeanPostProcessor的after初始化方法。

    先来看看applyBeanPostProcessorsBeforeInstantiation方法。

    2、applyBeanPostProcessorsBeforeInstantiation

    这里面可以看出来其调用了InstantiationAwareBeanPostProcessor的postProcessBeforeInstantiation方法,如果返回的不为空,则直接return出去了,这些代码比较简单直接,不需要特别解释。

    然后第二个红框中的applyBeanPostProcessorsAfterInitialization方法

    3、applyBeanPostProcessorsAfterInitialization

    这里没有什么好去解释的,这证实了上面我们说的如果postProcessBeforeInstantiation如果不返回空则不进行后序spring的操作,并且还会执行BeanPostProcessor的after初始化方法。

    然后看postProcessAfterInstantiation

    在上面我们解释的是对象创建以前的时候那个回调会被执行。现在和这个postProcessAfterInstantiation方法是在bean创建了,但还没有自动装配的时候。前面我们说了创建bean的方法是,那么我们进入这个方法

    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#doCreateBean

    doCreateBean

    这里面我们不过多描述Spring在自动装配以前如何通过构造器创建对象,这个我上一篇博客有详细解释。

    我们看这个populateBean方法,这个方法时给当前已经创建出来的Bean填充属性的。

    populateBean

    可以看到这里面如果postProcessAfterInstantiation方法的返回值为false,那么直接return,后序的自动装配代码就不会被执行到。

    至此,这个回调接口解释完,具体应用场景看项目业务要求,目前我还没有使用过。

  • 相关阅读:
    我回来了.jpg
    NOIp2016 day1解题报告
    丢人笔记:黑科技——使用streambuf加速读入输出
    点分治总结
    改一下OI代码风格
    算法笔记:笛卡尔树
    复腱
    poj3348Cows 凸包板子
    线段树板子poj3468
    CH4201楼兰图腾
  • 原文地址:https://www.cnblogs.com/daihang2366/p/15349430.html
Copyright © 2011-2022 走看看