InstantiationAwareBeanPostProcessor学习

简介

InstantiationAwareBeanPostProcessor 是 Spring 框架中的一个核心接口,它允许在 Spring 容器实例化 bean 之前和之后执行自定义逻辑。这个接口扩展了 BeanPostProcessor 接口,并增加了与 bean 实例化和属性填充相关的回调方法。

这个接口定义的主要方法包括:

  • postProcessBeforeInstantiation(Class<?> beanClass, String beanName): 在实例化 bean 之前调用。如果此方法返回非 null 对象,则 Spring 容器将不会创建目标 bean 的实例,而是使用此方法返回的对象。
  • postProcessAfterInstantiation(Object bean, String beanName): 在实例化 bean 之后但在属性填充之前调用。你可以在此方法中对 bean 进行进一步的处理,或者决定是否应该继续进行后续的初始化过程。
  • postProcessProperties(PropertyValues pvs, Object bean, String beanName): 在 bean 的属性填充之后调用。你可以在此方法中访问和修改 bean 的属性。

InstantiationAwareBeanPostProcessor 在 Spring 的 AOP(面向切面编程)实现中起着重要作用,特别是当使用基于代理的 AOP 时。例如,AbstractAutoProxyCreator 是一个 InstantiationAwareBeanPostProcessor 的实现,它负责为目标 bean 创建代理对象。

如果你需要自定义 bean 的实例化过程,或者需要在 bean 实例化或属性填充前后执行某些逻辑,你可以实现 InstantiationAwareBeanPostProcessor 接口,并在 Spring 配置中注册你的实现。这样,Spring 容器在创建 bean 时会调用你的实现中的相应方法。

请注意,由于 InstantiationAwareBeanPostProcessor 会在 bean 的生命周期中较早的阶段被调用,因此在使用它时需要格外小心,以避免与 Spring 容器或其他 bean 后处理器产生冲突或不可预测的行为。

源码

public interface InstantiationAwareBeanPostProcessor extends BeanPostProcessor {

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

	default boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
		return true;
	}
	
	@Nullable
	default PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName)
			throws BeansException {

		return null;
	}

	@Deprecated
	@Nullable
	default PropertyValues postProcessPropertyValues(
			PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName) throws BeansException {

		return pvs;
	}

}

AbstractAutoProxyCreator#postProcessAfterInitialization

public Object postProcessAfterInitialization(@Nullable Object bean, String beanName) {
		if (bean != null) {
			//从缓存中获取
			Object cacheKey = getCacheKey(bean.getClass(), beanName);
			//如果这个bean是需要代理的bean 则进行封装(返回代理对象)
			if (this.earlyProxyReferences.remove(cacheKey) != bean) {
				return wrapIfNecessary(bean, beanName, cacheKey);
			}
		}
		return bean;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值