2016-01-05 70 views
0

我想在contextDestroyed中獲取bean,所以我有這段代碼。如何在上下文中從ServletContextListener中獲取beanDestroyed

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。爲什麼?獲取豆類的正確選擇是什麼

回答

0

您有2個MyContextListener的實例。一個由Spring配置,另一個來自Web容器。

由Spring配置的配置將具有ApplicationContextAware回調並具有appContext屬性集,但它不爲您的servlet容器所知,因此不會參與生命週期回調。

第二個實例是一個在你的servlet容器,但是因爲這是不是一個Spring管理的話,會不會收到回調爲ApplicationContextAware,因此該appContext將是null

使它變成「解決」它,因爲它現在是一個類變量,而不是一個實例變量。現在所有實例共享該變量。

最好是刪除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或其他配置方法),並且您可以刪除彈簧管理的實例。

+0

hm thx。我不知道2個實例。 – hudi

相關問題