springboot中使用ContextLoaderListener.getCurrentWebApplicationContext();獲取WebApplicationContext爲空問題

WebApplicationContext applicationContext =  ContextLoaderListener.getCurrentWebApplicationContext();

在springboot 2.0.0.M7 版本中遇到使用以上代碼獲取 WebApplicationContext 爲null的問題。web

經過上網查詢緣由已解決,方法以下:spring

@Component @Lazy(false) public class ApplicationContextRegister implements ApplicationContextAware { private static final Logger LOGGER = LoggerFactory.getLogger(ApplicationContextRegister.class); private static ApplicationContext APPLICATION_CONTEXT; /** * 設置spring上下文 * * @param applicationContext spring上下文 * @throws BeansException */ @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { LOGGER.debug("ApplicationContext registed-->{}", applicationContext); APPLICATION_CONTEXT = applicationContext; } public static ApplicationContext getApplicationContext() { return APPLICATION_CONTEXT; } }

再使用:tomcat

CrawlerService crawlerService = ApplicationContextRegister.getApplicationContext().getBean(CrawlerService.class);

獲取不到的緣由:springboot不管以main方法仍是spring-boot:run的方式執行都不會跑SpringBootServletInitializer中的onStartup致使ContextLoaderListener沒有執行。springboot

考慮到以往的經驗ContextLoaderListener通常是配置在web.xml中的對web容器有依賴,因此我直接把工程打成war放到tomcat跑果真能夠調用SpringBootServletInitializer中的onStartup,app

可是仍是不能獲取ContextLoader.getCurrentWebApplicationContext(),緣由是在onStartup初始化ContextLoader時使用的是構造函數,沒有用ContextLoader.initWebApplicationContext方式,ide

因此獲取不到,要用這種方式得重寫SpringBootServletInitializer中的onStartup。函數

解決方法來自:http://www.oschina.net/question/2416168_2189114spring-boot

相關文章
相關標籤/搜索