Spring-动态替换Bean
问题
假如spring-boot项目引用了第三方库, 里面有个类通过autowire引用了:testService, 如何修改testService里面的实现逻辑呢? 通过动态替换testService为自定义的bean可以实现这个功能
实现原理
- 添加一个新的TestService2与原testService实现同样的接口
- 添加一个组件实现: BeanDefinitionRegistryPostProcessor
- 使用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 {
}
}