栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

spring源码分析-BeanPostProcessor

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

spring源码分析-BeanPostProcessor

spring-系列

文章目录

spring-系列前言接口描述

BeanPostProcessorInstantiationAwareBeanPostProcessorSmartInstantiationAwareBeanPostProcessorDestructionAwareBeanPostProcessorMergedBeanDefinitionPostProcessor 总结


前言

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

接口描述

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

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

}

根据源码会发现postProcessBeforeInitialization(Object bean, String beanName) 是在初始化(InitializingBean的afterPropertiesSet或自定义init方法)之前执行,可以修改或包装Bean的实例。 postProcessAfterInitialization(Object bean, String beanName) 方法则相反在初始化之后执行,可以修改或包装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;
	}

}

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

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

}

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

DestructionAwareBeanPostProcessor
public interface DestructionAwareBeanPostProcessor extends BeanPostProcessor {

	
	void postProcessBeforeDestruction(Object bean, String beanName) throws BeansException;

	
	default boolean requiresDestruction(Object bean) {
		return true;
	}

}

用于添加Bean销毁前回调。

MergedBeanDefinitionPostProcessor
public interface MergedBeanDefinitionPostProcessor extends BeanPostProcessor {

	
	void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class beanType, String beanName);

	
	default void resetBeanDefinition(String beanName) {
	}

}


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

总结

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/704715.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号