我们有一个Spring应用程序,该应用程序托管在 共享的tomcat实例上 。
有时我们必须重新加载spring应用程序上下文,但又不想重新启动Tomcat服务器,因为其他应用程序也托管在该服务器中。
是否正在通过刷新Spring应用程序上下文
((ConfigurableApplicationContext)applicationContext).refresh();
认为是 不良做法 ?
我有什么选择?
可能出现的一些问题-
首先,refresh() 应该 销毁当前存在于上下文中的所有bean(singletons等)并重新创建它们,因此可能发生的任何自举将再次发生(将东西放入InitializingBeanbeans中)。对于您来说,这更是一个问题,以确保您编写的所有初始化代码都可以安全地再次执行。
InitializingBean
需要注意的另一件事是刷新将如何影响永久内存的生成(permgen)。由于spring可以(并且将)代理类并创建即时运行时类,因此这可能证明是资源泄漏,因为bean工厂在刷新上下文时可能会创建新的运行时类。