因为各种各样的需求,我们不希望重启应用,而刷新Applicationcontext中的bean。一般根据情况,由以下几种策略。
1.刷新所有的bean。
WebApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(ServletActionContext.getServletContext());
((AbstractRefreshableApplicationContext) context).refresh();
2.如果是bean是prototype的。由于每次都是新生成的bean,可以实时变化。所以一个简单的方法是可以讲需要实时刷新的bean设为prototype。
3.刷新指定的bean,适用于刷新数据库factory等链接中断,需要重新链接的情形。
DefaultListableBeanFactory defaultListableBeanFactory =(DefaultListableBeanFactory) xmlWebApplicationContext.getBeanFactory();
BeanDefinition beanDefinition = defaultListableBeanFactory.getBeanDefinition("pooledConnectionFactory");
beanDefinition.setBeanClassName(PooledConnectionFactory.class.getName());
defaultListableBeanFactory.registerBeanDefinition( "pooledConnectionFactory", beanDefinition);
4.借用插件例如jrebel进行热部署替换