在 Spring 中如何扩展现有类的功能2 ?

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

0%