[英]How to get bean from ServletContextListener in contextDestroyed
我想在contextDestroyed中获取bean,所以我有这段代码。
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
。 但是当我将其更改为
private static ApplicationContext appContext;
然后我可以看到我的appContext。 为什么呢 什么是获得豆类的正确选择
您有2个MyContextListener
实例。 一个由Spring配置,另一个由Web容器配置。
Spring配置的一个将具有ApplicationContextAware
回调并设置appContext
属性,但是您的servlet容器不知道该回调,因此不会参与生命周期回调。
第二个实例是您的servlet容器中的一个实例,但是由于它不是spring托管的实例,因此不会收到ApplicationContextAware
的回调,因此appContext
将为null
。
使它成为static
类型的“解决方案”是因为它现在是类变量而不是实例变量。 现在所有实例共享该变量。
最好删除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托管实例。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.