spring源码分析-BeanPostProcessor

spring-系列



前言

BeanPostProcessor接口是spring重要的接口之一,Bean的增强功能大部分都是基于这个接口来实现。如通过 @Autowired@Value@Resource@PostConstruct@PreDestroy等注解都是基于BeanPostProcessor的子接口InstantiationAwareBeanPostProcessor接口实现逻辑处理。本文跟着博主一起来揭开BeanPostProcessor的神秘面纱。

接口描述

BeanPostProcessor是允许自定义修改新建bean实例的工厂钩子,spring为了增强该接口的功能定义了4个子接口InstantiationAwareBeanPostProcessorSmartInstantiationAwareBeanPostProcessorDestructionAwareBeanPostProcessorMergedBeanDefinitionPostProcessor下面讨论他们。

BeanPostProcessor


public interface BeanPostProcessor {

	/**
	 * 在任何bean初始化回调之前(如InitializingBean的afterPropertiesSet或自定义init方法),将此应用于给定的新bean实例。
	 * bean将已经被属性值填充。返回的bean实例可能是原始实例的包装器。
	 * 
	 */
	@Nullable
	default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
		return bean;
	}

	/**
	 * 在任何bean初始化回调之后(如InitializingBean的afterPropertiesSet}或自定义init方法),将此{@code BeanPostProcessor}应用于给定的新bean实例。
	 * 	bean将已经被属性值填充。返回的bean实例可能是原始实例的包装器。
	 */
	@Nullable
	default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
		return bean;
	}

}

根据源码会发现postProcessBeforeInitialization(Object bean, String beanName) 是在初始化(InitializingBeanafterPropertiesSet或自定义init方法)之前执行,可以修改或包装Bean的实例。 postProcessAfterInitialization(Object bean, String beanName) 方法则相反在初始化之后执行,可以修改或包装Bean的实例。

InstantiationAwareBeanPostProcessor


public interface InstantiationAwareBeanPostProcessor extends BeanPostProcessor {

	/**
	 * 根据beanClass和beanName实例化Bean,返回实例化对象,如果实例化成功将忽略spring默认初始化的逻辑,否则使用spring的内部初始化逻辑
	 */
	@Nullable
	default Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
		return null;
	}

	/**
	 * 在通过构造函数或工厂方法实例化bean之后,但在Spring属性填充(来自显式属性或自动连接)发生之前,执行操作。
	 */
	default boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
		return true;
	}

	/**
	 * 处理bean的属性值《spring注入就是从这个方法开始》,发生在实例化Bean之后,初始化Bean(InitializingBean#afterPropertiesSet或自定义init方法)之前
	 */
	@Nullable
	default PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName)
			throws BeansException {

		return null;
	}

	/**
	 * 根据Bean的属性描述来赋值,spring1.5之后已被弃用,由postProcessProperties方法来取代
	 */
	@Deprecated
	@Nullable
	default PropertyValues postProcessPropertyValues(
			PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName) throws BeansException {

		return pvs;
	}

}

根据源码很显然InstantiationAwareBeanPostProcessor是为Bean的实例化和属性赋值而生的,当存在多个InstantiationAwareBeanPostProcessor接口时只要有一个实例化成功,将直接返回。postProcessProperties(PropertyValues pvs, Object bean, String beanName)是属性值注入的入口方法, @Resource注入方式使用了CommonAnnotationBeanPostProcessor实现,@Autowired@ValueAutowiredAnnotationBeanPostProcessor类实现。

SmartInstantiationAwareBeanPostProcessor

public interface SmartInstantiationAwareBeanPostProcessor extends InstantiationAwareBeanPostProcessor {

	/**
	 * 预测最终从此处理器的{@link#postprocessebefore实例化}回调返回的bean的类型
	 */
	@Nullable
	default Class<?> predictBeanType(Class<?> beanClass, String beanName) throws BeansException {
		return null;
	}

	/**
	 * 确定用于给定bean的候选构造函数。默认返回null
	 */
	@Nullable
	default Constructor<?>[] determineCandidateConstructors(Class<?> beanClass, String beanName)
			throws BeansException {

		return null;
	}

	/**
	 * 对指定bean获取早期访问的引用,通常用于解析循环引用。
	 */
	default Object getEarlyBeanReference(Object bean, String beanName) throws BeansException {
		return bean;
	}

}

很显然SmartInstantiationAwareBeanPostProcessorInstantiationAwareBeanPostProcessor的扩展,添加了一下默认预测方法,目标都是为了Bean的实例化和注入,例如AutowiredAnnotationBeanPostProcessor就是继承该接口。

DestructionAwareBeanPostProcessor


public interface DestructionAwareBeanPostProcessor extends BeanPostProcessor {

	/**
	 * 在给定bean实例销毁之前,将此BeanPostProcessor应用于该实例,例如调用自定义销毁回调。
	 */
	void postProcessBeforeDestruction(Object bean, String beanName) throws BeansException;

	/**
	 * 确定给定bean实例是否需要此后处理器销毁
	 */
	default boolean requiresDestruction(Object bean) {
		return true;
	}

}

用于添加Bean销毁前回调。

MergedBeanDefinitionPostProcessor


public interface MergedBeanDefinitionPostProcessor extends BeanPostProcessor {

	/**
	 * 对指定bean的给定合并bean定义进行后期处理。
	 */
	void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class<?> beanType, String beanName);

	/**
	 * 通知指定名称的bean定义已重置,并且此后处理器应清除受影响bean的所有元数据
	 */
	default void resetBeanDefinition(String beanName) {
	}

}


MergedBeanDefinitionPostProcessor是spring内部实现合并bean定义的后处理器回调接口。一般情况下不用研究。

总结

BeanPostProcessor是spring对Bean功能增强的实现,其中InstantiationAwareBeanPostProcessorSmartInstantiationAwareBeanPostProcessorDestructionAwareBeanPostProcessorMergedBeanDefinitionPostProcessor就是spring在内部增强Bean的体现,一般情况下不推荐直接使用这些内部接口。当我们自己开发一个spring插件或者是个性化处理功能时可以考虑使用BeanPostProcessor接口来实现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

罗德阿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值