在春季与hibernate集成,我有以下要求。我需要重新加载/重新创建/刷新/更新唯一的sessionFactory bean。
但是当使用
时 ((ConfigurableApplicationContext)ApplicationContextProvider.getApplicationContext()).refresh();
重新加载整个应用程序上下文(所有bean)。
你能帮我重新加载一个单一的bean基于一些条件(如用户选择/点击一些选项在UI级别)
谢谢. .
这不是一个直接的答案,但我认为在应用程序上下文中重新加载新的SessionFactory
而不重新加载使用它的其他bean 将导致严重的问题。SessionFactory
通常是一个单例bean,因此仅在上下文刷新时使用它注入其他bean。因此,即使您设法在应用程序上下文中放置了一个新的SessionFactory
bean,也不会有DAO知道这个更改,甚至可能尝试使用封闭工厂……
如果您真的想要刷新SessionFactory
bean,您必须:
- 关闭旧bean
- 创建一个新的
- 小心地将它注入到所有 bean(通常是DAO)中,这些bean使用它来模仿spring在刷新时所做的事情
- 和所有应该是"原子的",在所有bean准备好之前不应该处理任何请求。
这是你的应用程序,但在我看来都是容易出错的。至少要确保为维护人员提供红色闪烁注释…
兄弟。试试吧~
DefaultListableBeanFactory defaultListableBeanFactory =(DefaultListableBeanFactory) xmlWebApplicationContext.getBeanFactory();
BeanDefinition beanDefinition = defaultListableBeanFactory.getBeanDefinition("pooledConnectionFactory");
beanDefinition.setBeanClassName(PooledConnectionFactory.class.getName());
defaultListableBeanFactory.registerBeanDefinition( "pooledConnectionFactory", beanDefinition);