在 spring 中,我们常常会基于现有的代码来扩展之前的功能,或者换一个实现的方式。
在上一篇中,我使用 BeanPostProcessor
来进行扩展。
而在这一篇中,我使用 BeanDefinitionRegistryPostProcessor
来进行扩展。
由于已经实现过一次,我这里就不多说了。
1. 实现思路
- 判断
beanName
- 删除原有的
beanDefinition
- 注册新的
beanDefinition
注意点:
- 新实现的类,必须要是
CompositePropertySources
的子类,否则注入会有问题 - 所有方法都必须重新实现一遍,无法复用父类的方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
@Component
public class CompositePropertySourcesBeanDefinitionRegistry implements BeanDefinitionRegistryPostProcessor {
public static final String COMPOSITE_PROPERTY_SOURCES_BEAN_NAME = "compositePropertySources";
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
if (registry.containsBeanDefinition(COMPOSITE_PROPERTY_SOURCES_BEAN_NAME)) {
registry.removeBeanDefinition(COMPOSITE_PROPERTY_SOURCES_BEAN_NAME);
RootBeanDefinition definition = new RootBeanDefinition(ProxyCompositePropertySources.class);
definition.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_CONSTRUCTOR);
registry.registerBeanDefinition(COMPOSITE_PROPERTY_SOURCES_BEAN_NAME, definition);
}
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
}
}
|
2. 如何选择
- 如果是改进之前的功能,就使用第一种方式,
BeanPostProcessor
- 如果是重写之前的功能,就使用第二种方式,
BeanDefinitionRegistryPostProcessor
- 如果不好选择,就啥用第二种方式,也是最强大的。
2. 完整代码实现
github 地址