SpringBoot 上下文动态改变Bean
如果使用使用 beanFactory.removeBeanDefinition(“b”); 会导致依赖该Bean的其他Bean失效,例如a是依赖b创建的,那么当b被removeBeanDefinition,那么a就会随着a的销毁而失效需要被重建,在有些情况下我们期望这样。但另一些情况并没有这样操作的意义,例如:a创建的时间代价非常大,或者a的重复创建会导致异常(例如端口占用)等。所以就需要另一种方法替换Bean
下面展示一些
内联代码片
。
DefaultListableBeanFactory beanFactory = (DefaultListableBeanFactory) context.getBeanFactory();
//反射获取Factory中的singletonObjects 将该名称下的bean进行替换
Field singletonObjects = DefaultSingletonBeanRegistry.class.getDeclaredField("singletonObjects");
singletonObjects.setAccessible(true);
Map<String, Object> map = (Map<String, Object>) singletonObjects.get(beanFactory);
map.put("b", new B() {
@Override
public void f() {
System.out.println("测试b");
}
});
B bean1 = beanFactory.getBean(B.class);
bean1.f();