SpringBoot Web開發之系統任務啟動與路徑映射和框架整合
本章概要
- 啟動系統任務
- 整合 Servlet、Filter 和 Listener
- 路徑映射
啟動系統任務
有一些特殊的任務需要在系統啟動時執行,例如配置文件加載,數據庫初始化等操作。如果沒有使用 Spring Boot ,這些問題可以在 Listener 中解決。Spring Boot 對此提供瞭兩種解決方案 CommandLineRunner 和 ApplicationRunner。兩者基本一致,差別主要體現在參數上。
CommandLineRunner
Spring Boot 項目在啟動時會遍歷所有 CommandLineRunner 的實現類並調用其中的 run 方法,如果整個系統中有多個 CommandLineRunner 的實現類,那麼可以使用 @Oder 註解對這些實現類的調用順序進行排序。
在一個 Spring Boot Web 項目中(Spring Boot 項目引入 Web 依賴)添加兩個 CommandLineRunner,分別如下:
@Component @Order(1) public class MyCommandLineRunner1 implements CommandLineRunner { @Override public void run(String... args) throws Exception { System.out.println("Runner1>>>"+ Arrays.toString(args)); } }
@Component @Order(2) public class MyCommandLineRunner2 implements CommandLineRunner { @Override public void run(String... args) throws Exception { System.out.println("Runner2>>>"+Arrays.toString(args)); } }
代碼解釋:
- @Order(1) 註解用來描述 CommandLineRunner 的執行順序,數字越小越先執行。
- run 方法中是調用的核心邏輯,參數是系統啟動時傳入的參數,即入口類中 main 方法的參數(在調用 SpringApplication.run 方法時被傳入 Spring Boot 項目中)
在系統啟動時,配置傳入的參數,以 IDEA 為例,配置方式如下:
步驟01:單擊右上角的編輯啟動配置,如圖:
步驟02:在打開的新頁面中編輯 Program arguments:
啟動項目,啟動日志如圖:
ApplicationRunner
在一個Spring Boot Web 項目中信件兩個 ApplicationRunner,代碼如下:
@Component @Order(2) public class MyApplicationRunner1 implements ApplicationRunner { @Override public void run(ApplicationArguments args) throws Exception { List<String> nonOptionArgs = args.getNonOptionArgs(); System.out.println("1-nonOptionArgs>>>" + nonOptionArgs); Set<String> optionNames = args.getOptionNames(); for (String optionName : optionNames) { System.out.println("1-key:" + optionName + ";value:" + args.getOptionValues(optionName)); } } }
@Component @Order(1) public class MyApplicationRunner2 implements ApplicationRunner { @Override public void run(ApplicationArguments args) throws Exception { List<String> nonOptionArgs = args.getNonOptionArgs(); System.out.println("2-nonOptionArgs>>>" + nonOptionArgs); Set<String> optionNames = args.getOptionNames(); for (String optionName : optionNames) { System.out.println("2-key:" + optionName + ";value:" + args.getOptionValues(optionName)); } } }
代碼解釋:
- @Order 註解依然是用來描述執行順序的,數字越小越優先執行
- @不同於 CommandLineRunner 中的 run 方法的 String 數組參數,這裡 run 方法的參數是一個 ApplicationArguments 對象,如果想從 ApplicationArguments 對象中獲取入口類中的 main 方法接收的參數,調用 ApplicationArguments 中的 getNonOptionArgs 方法即可。ApplicationArguments 中的getOptionNames方法用來獲取項目啟動命令中參數的 key ,例如將本項目打成 jar 包,運行 java -jar xxx.jar -name=Michael 命令來啟動項目,此時 getOptionNames方法獲取到的就是 name ,而 getOptionValues 方法則是獲取相應的 value。
打包程序,執行如下命令啟動項目:
java -jar chapter04-0.0.1-SNAPSHOT.jar –name=Michael –age=99 鬥羅大陸 唐傢三少
日志如下:
整合Servlet與Filter和Listener
一般情況下,使用Spring 、 Spring MVC 這些框架後,基本上就告別 Servlet、Filter 、 Listerer 瞭,但是有時在整合一些第三方框架時,可能還是不得不使用 Servlet ,比如在整合某報表插件時就需要使用 Servlet。Spring Boot 中對於整合這些基本的 Web 組件也提供瞭很好的支持。
在一個 Spring Boot Web 項目中添加如下三個組件:
@WebServlet("/my") public class MyServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp){ doPost(req,resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp){ System.out.println("name>>>"+req.getParameter("name")); } } @WebServlet("/my") public class MyServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp){ doPost(req,resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp){ System.out.println("name>>>"+req.getParameter("name")); } }
@WebFilter("/*") public class MyFilter implements Filter { @Override public void init(FilterConfig filterConfig){ System.out.println("MyFilter>>>init"); } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { System.out.println("MyFilter>>>doFilter"); chain.doFilter(request,response); } @Override public void destroy() { System.out.println("MyFilter>>>destroy"); } }
@WebListener public class MyListener implements ServletRequestListener { @Override public void requestDestroyed(ServletRequestEvent sre) { System.out.println("MyListener>>>requestDestroyed"); } @Override public void requestInitialized(ServletRequestEvent sre) { System.out.println("MyListener>>>requestInitialized"); } }
代碼解釋:
- 定義瞭三個基本的組件,分別使用 @WebServlet 、@WebFilter、@WebListener 三個註解進行標記
- 這裡以 ServletRequestListener 為例,但是對於其他的 Listener ,例如 HttpSessionListener、ServletContextListener 等也是支持的
在項目入口類上添加 @ServletComponentScan 註解,實現對 Servlet、Filter 、Listener 的掃碼,如下:
@SpringBootApplication @ServletComponentScan public class Chapter04Application { public static void main(String[] args) { SpringApplication.run(Chapter04Application.class, args); } }
最後啟動項目,瀏覽器輸入"http://localhost:8081/my?name=Michael",可以看到相關日志,如下:MyListener>>>requestInitialized
MyFilter>>>doFilter
name>>>Michael
MyListener>>>requestDestroyed
路徑映射
一般情況下,使用瞭頁面模板後,用戶需要通過控制器才能訪問頁面。有一些頁面需要在控制器中加載數據,然後渲染才能顯示出來;還有一些頁面在控制器中不需要加載數據,隻是完成簡單的跳轉,對於這種頁面,可以直接配置路徑映射。例如,有兩個 Thymeleaf 做模板的頁面 login.html 和 index.html ,直接在 addViewControllers 方法配置映射關系即可:
@Configuration public class WebMvcConfig implements WebMvcConfigurer { @Override public void addViewControllers(ViewControllerRegistry registry){ registry.addViewController("/login").setViewName("login"); registry.addViewController("/index").setViewName("index"); } }
到此這篇關於SpringBoot Web開發之系統任務啟動與路徑映射和框架整合的文章就介紹到這瞭,更多相關SpringBoot 框架整合內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- SpringBoot 在項目啟動之後執行自定義方法的兩種方式小結
- Spring boot CommandLineRunner啟動任務傳參實例詳解
- springBoot啟動時讓方法自動執行的幾種實現方式
- springboot使用CommandLineRunner解決項目啟動時初始化資源的操作
- Springboot啟動執行特定代碼的方式匯總