人不能忘本,时隔半个多月的技术文再次回归。
本篇向大家介绍 spring 框架中的常用扩展点,说白了就是 spring 提供了哪些接口供开发人员实现,实现这些接口能够完成一些应用特有的逻辑。本文会对这些接口赋予一个常用系数,系数越高,说明是笔者平时使用频次较高的,最高三颗星。
天蓝的正好,风来的及时,你美的让人忘了前两个
采用的 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 之前或之后完成一些特殊操作,比如对初始化状态的一些检查。
做自己比照顾别人的情绪容易多了
InitializingBean 接口
常用系数:♥♥♥
接口定义:
public interface InitializingBean {
// 在 bean 中所有属性赋值完成之后调用
void afterPropertiesSet() throws Exception;
}
接口功效:可以实现该接口,检查 bean 中的属性值是否满足应用条件等。
以上就是笔者整理的在日常工作中运用比较多的几个扩展点。当然了,spring 中的扩展点远远不止这么多,感兴趣的读者可以自己跟踪下源码,肯定是会有更多的新发现。阅读源码时不需要细致到每一行,抓住重点和核心阅读即可。
文章到这就结束了,虽然技术文可能没水文阅读量多,但还是要写,因为苹果会越分越少,但知识不会。后会有期。