在 spring 中,最常用的两种扩展就是 BeanFactoryPostProcessor
和 BeanPostProcessor
, 当然还有其他的扩展,比如 ApplicationListener
, SpringApplicationRunListener
等等。
BeanFactoryPostProcessor
源码位置: org.springframework.beans.factory.config.BeanFactoryPostProcessor
1
2
3
4
5
6
| @FunctionalInterface
public interface BeanFactoryPostProcessor {
// 可以用 beanFactory 来修改 beanDefinition, 注册 singletonBean
void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;
}
|
源码位置: org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor
1
2
3
4
5
6
| // 当前类是 BeanFactoryPostProcessor 的子接口
public interface BeanDefinitionRegistryPostProcessor extends BeanFactoryPostProcessor {
// 可以用 registry 来注册和修改 beanDefinition
void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException;
}
|
BeanPostProcessor
源码位置: org.springframework.beans.factory.config.BeanPostProcessor
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| public interface BeanPostProcessor {
// 在 InitializingBean#afterPropertiesSet 执行前
default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
// 1. 可以返回代理对象
// 2. 可以设置bean的属性 (这里)
return bean;
}
// 在 InitializingBean#afterPropertiesSet 执行后
default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
// 1. 可以返回代理对象
// 2. 可以设置bean的属性
return bean;
}
}
|
源码位置: org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
| // 当前类是 BeanPostProcessor 的子接口
public interface InstantiationAwareBeanPostProcessor extends BeanPostProcessor {
// 执行实例化之前
default Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
return null;
}
// 执行实例化之后
default boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
return true;
}
// 填充属性
default PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName)
throws BeansException {
return null;
}
// 过期方法,和 postProcessProperties 一样
@Deprecated
default PropertyValues postProcessPropertyValues(
PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName) throws BeansException {
return pvs;
}
}
|
源码位置: org.springframework.beans.factory.config.SmartInstantiationAwareBeanPostProcessor
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| // 当前类是 BeanPostProcessor 的子接口
public interface SmartInstantiationAwareBeanPostProcessor extends InstantiationAwareBeanPostProcessor {
// 预测 bean 的类型,这个方法用的很少
default Class<?> predictBeanType(Class<?> beanClass, String beanName) throws BeansException {
return null;
}
// 决定候选的构造函数, 这个方法用的很少
default Constructor<?>[] determineCandidateConstructors(Class<?> beanClass, String beanName)
throws BeansException {
return null;
}
// 返回 early 访问的 bean 引用 (解决循环引用)
default Object getEarlyBeanReference(Object bean, String beanName) throws BeansException {
// 可以返回代理对象
return bean;
}
}
|
其他扩展
ApplicationListener
: 监听 spring
事件,比如 ContextRefreshedEvent
, ContextStartedEvent
。
SpringApplicationRunListener
: 监听 spring boot
事件,比如 contextLoaded
,started
。
ApplicationRunner
, CommandLineRunner
: 服务启动的回调。
InitializingBean
: 初始化 bean
的回调。
DisposableBean
: 销毁 bean
的回调。
*Aware
: 注入 bean
的回调,比如 ApplicationContextAware
, EnvironmentAware
。
FactoryBean
: 创建 bean
的工厂类。