Spring-动态替换Bean

问题

假如spring-boot项目引用了第三方库, 里面有个类通过autowire引用了:testService, 如何修改testService里面的实现逻辑呢? 通过动态替换testService为自定义的bean可以实现这个功能

实现原理

  1. 添加一个新的TestService2与原testService实现同样的接口
  2. 添加一个组件实现: BeanDefinitionRegistryPostProcessor
  3. 使用BeanDefinitionRegistry动态替换bean

代码示例

@Component
public class MyBeanProcessor implements BeanDefinitionRegistryPostProcessor {
    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
        final String beanName = "testService";
        if (registry.containsBeanDefinition(beanName)) {
            registry.removeBeanDefinition(beanName);
            GenericBeanDefinition beanDefinition = new GenericBeanDefinition();
            beanDefinition.setBeanClass(TestService2.class);
            registry.registerBeanDefinition(beanName, beanDefinition);
        }
    }

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory factory) throws BeansException {

    }
}