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,后序的自动装配代码就不会被执行到。

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

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值