在 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 地址