spring 常用扩展点总结

255 阅读3分钟

人不能忘本,时隔半个多月的技术文再次回归。

本篇向大家介绍 spring 框架中的常用扩展点,说白了就是 spring 提供了哪些接口供开发人员实现,实现这些接口能够完成一些应用特有的逻辑。本文会对这些接口赋予一个常用系数,系数越高,说明是笔者平时使用频次较高的,最高三颗星。

magazine-unlock-02-2.3.2022081201-C3C41F15A6E65DF.jpg

天蓝的正好,风来的及时,你美的让人忘了前两个

采用的 spring 版本为 5.3.8。

BeanFactoryPostProcessor 接口

常用系数:♥♥

接口定义:

public interface BeanFactoryPostProcessor {
        
        // 对 ConfigurableListableBeanFactory 进行后置处理
	void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;

}

接口功效:如果需要对 ConfigurableListableBeanFactory 中的一些参数做设置,可以实现该接口。实现时可以额外实现 PriorityOrdered 或 Ordered 接口指定执行的顺序。

BeanDefinitionRegistryPostProcessor 接口,继承了 BeanFactoryPostProcessor

常用系数:♥♥

接口定义:

public interface BeanDefinitionRegistryPostProcessor extends BeanFactoryPostProcessor {
// 接口中只有一个需要实现的方法,在所有 bean 创建前调用。
void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException;

}

接口功效:可以通过方法传入的 BeanDefinitionRegistry 对象修改容器中的 bean 定义信息或是往里加入自定义的 bean 定义。

InstantiationAwareBeanPostProcessor 接口

常用系数:♥

接口定义:

public interface InstantiationAwareBeanPostProcessor extends BeanPostProcessor {

	// 该方法在 beanName 对应的 bean 实例创建前调用,即 doCreateBean 方法之前,如果该方法的返回值不为 null,则 doCreateBean 方法不会被调用
	default Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
		return null;
	}

	// 该方法在 beanName 对应的 bean 实例创建后,为 bean 中属性赋值前调用
	default boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
		return true;
	}

	// 该方法在 bean 实例创建之后调用;可以通过修改 PropertyValues,来影响后续的属性赋值流程
	@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;
	}

}

接口功效:如果需要介入某个 bean 的创建流程,比如为其创建代理;或者需要对 bean 中的属性赋值流程做特殊处理都可以实现该接口。该接口有个实现 AutowiredAnnotationBeanPostProcessor,该类就是处理自动注入的关键类,自定义实现时可以参考该类。

MergedBeanDefinitionPostProcessor 接口

常用系数:♥

接口定义:

public interface MergedBeanDefinitionPostProcessor extends BeanPostProcessor {

	// 该方法在 bean 实例创建之后调用,可以通过修改传入的 RootBeanDefinition ,来影响后面的属性赋值流程
	void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class<?> beanType, String beanName);

	// bean 定义信息被重置时收到 ioc 容器的通知,可用做一些清理工作
	default void resetBeanDefinition(String beanName) {
	}

}

接口功效:可以通过修改 RootBeanDefinition ,比如指定 bean 的初始化方法或设置 bean 的注入模式,来完成一些特殊的功能。

BeanPostProcessor 接口

常用系数:♥♥♥

接口定义:

public interface BeanPostProcessor {

	// 在 bean 中属性赋值完成后,初始化方法执行前调用
	@Nullable
	default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
		return bean;
	}

        // 在初始化方法执行后调用
	@Nullable
	default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
		return bean;
	}

}

接口功效:在初始化 bean 之前或之后完成一些特殊操作,比如对初始化状态的一些检查。

img-16604475438372c5af52a427ae23ada47e6dccd081d36.jpg

做自己比照顾别人的情绪容易多了

InitializingBean 接口

常用系数:♥♥♥

接口定义:

public interface InitializingBean {

	// 在 bean 中所有属性赋值完成之后调用
	void afterPropertiesSet() throws Exception;

}

接口功效:可以实现该接口,检查 bean 中的属性值是否满足应用条件等。

以上就是笔者整理的在日常工作中运用比较多的几个扩展点。当然了,spring 中的扩展点远远不止这么多,感兴趣的读者可以自己跟踪下源码,肯定是会有更多的新发现。阅读源码时不需要细致到每一行,抓住重点和核心阅读即可。

文章到这就结束了,虽然技术文可能没水文阅读量多,但还是要写,因为苹果会越分越少,但知识不会。后会有期。