spring Boot 填坑手冊: 無web.xml文件時的上下文監聽的配置

    Spring Boot提倡Spring 4.x以上版本 使用基於註解的配置代替xml文件配置 , 首當其衝的 , 便是 web.xml 配置全部消失了 。 那麼 ,當筆者想像其中注入監聽器和上下文時,遇到了難題 – 如何注入 ? 在哪裏注入 ?


    既然出現了問題,那麼接下了就是解決問題了,下面闡述筆者的解決方法 , 我就以最簡單的項目根文件目錄的監聽來闡述 :

  • 首先 注意包結構 , 在./src/java/*路徑下配置
  • 新建WebAppRootContext.java 該文件一定要實現 ServletContextInitializer類
  • 實現onStartup方法 , 添加WebAppRootListener監聽器 , 並定義文件初始化的上下文參數
  • 最後爲該類添加@Configuration
    @ComponentScan @EnableAutoConfiguration
    標籤聲明它爲一個上下文配置文件
  • 具體代碼如下:
@Configuration
@ComponentScan
@EnableAutoConfiguration
public class WebAppRootContext implements ServletContextInitializer {
    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        servletContext.addListener(WebAppRootListener.class);
        servletContext.setInitParameter(ContextParamDictionary.PROJECTPATH.getParamName(),//這裏是注入參數的名稱
        ContextParamDictionary.PROJECTPATH.getParamValue());
    } 
}
  • 對比web.xml文件配置如下:
    <context-param>
        <param-name>webAppRootKey</param-name>
        <param-value>projectRootPath</param-value>
    </context-param>
 <listener>
        <listener-class>org.springframework.web.util.WebAppRootListener</listener-class>
  </listener> 
  • 啓動工程,我們可以在日誌中看見 如下內容,說明注入成功
2016-09-16 15:26:40.999  INFO 15440 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2016-09-16 15:26:40.999  INFO 15440 --- [ost-startStop-1] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 8489 ms
  • 如此一來就可以使用System.getProperty(ContextParamDictionary.PROJECTPATH.getParamValue());//括號裏是 webAppRootKey 來獲取項目路徑了 ;(注:ContextParamDictionary.PROJECTPATH.getParamValue()這個 東西 是自己定義的路徑罷了,就是“projectRootPath”不要多想。)


後續補充:

上述是註解輔助手工監聽,還有純註解監聽標籤,使用 @WebListener

類似於:

@WebListener
public class XXXServerListener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        xxx
    }

    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
        xxx
    }
}

注入上下文參數,可使用@WebInitParam()標籤方便注入

使用該標籤時,需要在 springBoot啓動類上使用 @ServletComponentScan標籤
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章