Spring中BeanPostProcessor的八个实现应用点

我们都知道BeanPostProcessor是bean的增强器,最常用的是postProcessBeforeInitialization和postProcessAfterInitialization两个方法,但其实不止这两个扩展点,我们就总结一下它包含的扩展点和具体作用。

1.接口及子接口

核心接口BeanPostProcessor,在bean初始化前后调用。

public interface BeanPostProcessor {

	
	@Nullable
	default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
		return bean;
	}


	@Nullable
	default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
		return bean;
	}

}

InstantiationAwareBeanPostProcessor在实例化前后进行回调,设置显式属性之前的回调

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;
	}
}

SmartInstantiationAwareBeanPostProcessor拓展bean的实例化流程,前面两个在实例化和初始化前后,而SmartInstantiationAwareBeanPostProcessor可以做特殊扩展点,比如提前暴露getEarlyBeanReference等。

public interface SmartInstantiationAwareBeanPostProcessor extends InstantiationAwareBeanPostProcessor {
	@Nullable
	default Class<?> predictBeanType(Class<?> beanClass, String beanName) throws BeansException {
		return null;
	}

	@Nullable
	default Constructor<?>[] determineCandidateConstructors(Class<?> beanClass, String beanName)
			throws BeansException {

		return null;
	}


	default Object getEarlyBeanReference(Object bean, String beanName) throws BeansException {
		return bean;
	}


}

了解了三个BeanPostProcessor接口及子接口后,就介绍一下他的拓展点及应用

2.应用点

单词含义
Instantiation表示实例化,对象还未生成
Initialization表示初始化,对象已经生成

1.InstantiationAwareBeanPostProcessor::postProcessBeforeInstantiation

顾名思义就是在实例化的处理器,前置方法 作用:跳出后续执行过程 自身方法,是最先执行的方法,它在目标对象实例化之前调用,该方法的返回值类型是Object,我们可以返回任何类型的值。由于这个时候目标对象还未实例化,所以这个返回值可以用来代替原本该生成的目标对象的实例(比如代理对象)。如果该方法的返回值代替原本该生成的目标对象,后续只有postProcessAfterInitialization方法会调用,其它方法不再调用;否则按照正常doCreateBean流程。

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

2.InstantiationAwareBeanPostProcessor::postProcessAfterInstantiation

顾名思义在实例化后置方法 作用:postProcessPropertyValues方法是否执行 在目标对象实例化之后调用,这个时候对象已经被实例化,但是该实例的属性还未被设置,都是null。因为它的返回值是决定要不要调用postProcessPropertyValues方法的其中一个因素(因为还有一个因素是mbd.getDependencyCheck());如果该方法返回false,并且不需要check,那么postProcessPropertyValues就会被忽略不执行;如果返回true,postProcessPropertyValues就会被执行

	default boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
		return true;
	}

3.InstantiationAwareBeanPostProcessor::postProcessProperties

顾名思义处理属性值 作用:对属性值进行修改,如果postProcessAfterInstantiation方法返回false,该方法可能不会被调用。可以在该方法内对属性值进行修改

4.SmartInstantiationAwareBeanPostProcessor::determineCandidateConstructors

顾名思义选择合适的构造方法 作用:选择合适的构造方法用于实例化bean

5.SmartInstantiationAwareBeanPostProcessor::getEarlyBeanReference

顾名思义提前暴露 作用:解决循环依赖AOP,放入三级缓存中,ObjectFactory

6.MergedBeanDefinitionPostProcessor::postProcessMergedBeanDefinition

作用:@Autowired @Value @Resource 等预解析bean上的注解 用于后续初始化执行和赋值等

7.BeanPostProcessor::postProcessBeforeInitialization

作用:初始化前置处理器 比如@PostConstruct等注解

8.BeanPostProcessor::postProcessAfterInitialization

作用:初始化后置处理器 比如动态代理

总结

BeanPostProcessor及其子接口有很多扩展点,帮助我们在bean创建过程中去拓展和灵活创建。 总结了在创建过程中四个接口共八个方法作用,下面给一张流程图来一言蔽之各个方法作用点。

在这里插入图片描述

end
  • 作者:Endwas(联系作者)
  • 发表时间:2022-08-30 10:13
  • 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
  • 转载声明:如果是转博主转载的文章,请附上原文链接
  • 公众号转载:请在文末添加作者名字和博客地址
  • 评论