我想在contextDestroyed中获取bean,所以我有这段代码。
<a data-toggle="collapse" href="#cpanel0758223" data-parent="#stuff.a">Load Data</a>
问题是它记录public class MyContextListener implements ApplicationContextAware, ServletContextListener {
private final Logger logger = LogManager.getLogger(getClass());
private ApplicationContext appContext;
@Override
public void contextInitialized(ServletContextEvent event) {
logger.warn("Start");
}
@Override
public void contextDestroyed(ServletContextEvent event) {
logger.warn("End" + appContext);
appContext.getBean("myBean")
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.appContext = applicationContext;
}
}
。但是当我把它改成
null
然后我可以看到我的appContext。为什么?什么是获取bean的正确选项
答案 0 :(得分:0)
您有MyContextListener
的2个实例。一个由Spring配置,一个由Web容器配置。
由Spring配置的那个将具有ApplicationContextAware
回调并且设置了appContext
属性,但是您的servlet容器不知道它并且因此不会参与生命周期回调
第二个实例是servlet容器中的一个实例,但由于它不受管理,因此它不会收到ApplicationContextAware
的回调,因此appContext
将会是null
。
让它成为static
&#34;解决&#34;因为它现在是一个类变量而不是实例变量。现在所有实例都共享该变量。
最好删除ApplicationContextAware
并在侦听器中使用WebApplicationContextUtils.getRequiredWebApplicationContext
方法。
public class MyContextListener extends BaseTask implements ServletContextListener {
private final Logger logger = LogManager.getLogger(getClass());
@Override
public void contextInitialized(ServletContextEvent event) {
logger.warn("Start");
}
@Override
public void contextDestroyed(ServletContextEvent event) {
logger.warn("End" + appContext);
WebApplicationContextUtils.getRequiredWebApplicationContext(event.getServletContext()).getBean("myBean");
}
}
现在您只需要servlet容器的实例(web.xml或其他配置方法),您可以删除spring托管实例。