Java Spring重新创建特定的Bean
我想在某些数据库更改后在运行时重新创建(新对象)特定的Bean(不重新启动服务器)。看起来就是这样-
@Component
public class TestClass {
@Autowired
private MyShop myShop; //to be refreshed at runtime bean
@PostConstruct //DB listeners
public void initializeListener() throws Exception {
//...
// code to get listeners config
//...
myShop.setListenersConfig(listenersConfig);
myShop.initialize();
}
public void restartListeners() {
myShop.shutdownListeners();
initializeListener();
}
}
此类代码不会运行,因为myShop
Spring是由Singleton创建的对象,除非重新启动服务器,否则其上下文不会刷新。如何刷新(创建一个新对象)myShop
?
我想到的一种不好的方法是在myShop
内部创建新对象,restartListeners()
但这对我来说似乎不对。
-
在DefaultListableBeanFactory中,您具有公共方法destroySingleton(“
beanName”),因此可以使用它,但是您必须知道,如果您自动装配了bean,它将保留最初自动装配的对象的相同实例。可以尝试这样的事情:@RestController public class MyRestController { @Autowired SampleBean sampleBean; @Autowired ApplicationContext context; @Autowired DefaultListableBeanFactory beanFactory; @RequestMapping(value = "/ ") @ResponseBody public String showBean() throws Exception { SampleBean contextBean = (SampleBean) context.getBean("sampleBean"); beanFactory.destroySingleton("sampleBean"); return "Compare beans " + sampleBean + "==" + contextBean; //while sampleBean stays the same contextBean gets recreated in the context } }
它不是很漂亮,但显示了如何实现它。如果要处理的是控制器而不是组件类,则可以在方法参数中进行注入,并且它也可以工作,因为直到在方法内部需要时才重新创建Bean,至少看起来是这样。有趣的问题是,除了首先将其自动连线到的对象外,还有谁还引用了旧Bean,因为已将其从上下文中删除,所以我想知道它是否仍然存在,或者是否在控制器中释放了该对象而进行了垃圾收集上面的内容,如果上下文中的某些其他对象引用了它,则上面的内容会引起问题。
-
在每个请求中都会重新创建复合组件中的支持Bean
2021-01-30 关注 0 浏览68 1答案
-
使Spring Boot重新创建测试数据库
2021-02-02 关注 0 浏览192 1答案
-
Java从哈希码重新创建字符串
2021-01-30 关注 0 浏览104 1答案
-
如何在Spring的每个测试之前重新创建数据库?
2021-02-02 关注 0 浏览105 1答案
-
JSF 2.0:为什么即使仍在同一View上也要重新创建ViewScope Bean
2021-01-30 关注 0 浏览77 1答案
-
如何在Spring进行每次测试之前重新创建数据库?
2021-02-02 关注 0 浏览84 1答案
-
从 IEnumerable 重新创建字典>
2022-07-28 关注 0 浏览17 1答案
-
在Spring的每次测试之前,如何重新创建数据库?
2021-01-30 关注 0 浏览99 1答案
-
创建错的表格我可以删除重新创建。
2022-05-22 关注 0 浏览14 1答案
-
阻止TabControl重新创建其子级
2021-02-02 关注 0 浏览103 1答案