javascript
Spring Boot 2.X 来临,本文将带你起飞
轉載自? ?Spring Boot 2.X 來臨,本文將帶你起飛
當前互聯網技術盛行,以Spring 框架為主導的Java 互聯網技術成了主流,而基于Spring 技術衍生出來的Spring Boot,采用了“約定優于配置”的思想,極大地簡化了Spring 框架的開發。
隨著近些年來微服務技術的流行,Spring Boot 也成了時下炙手可熱的熱點技術。2017 年9 月,Spring 框架出現了重大版本升級,從4.x 版本升級為了5.x 版本,隨著這次升級,Spring Boot的版本也在2018年3月從1.x升級到了2.x。
Spring Boot的優點
談到Spring Boot,就讓我們先來了解它的優點。依據官方的文檔,Spring Boot的優點如下:
-
創建獨立的Spring應用程序;
-
嵌入的Tomcat、Jetty或者Undertow,無須部署WAR文件;
-
允許通過Maven來根據需要獲取starter;
-
盡可能地自動配置Spring;
-
提供生產就緒型功能,如指標、健康檢查和外部配置;
-
絕對沒有代碼生成,對XML沒有要求配置。
這段描述告訴我們,首先Spring Boot是一個基于Spring框架搭建起來的應用,其次它會嵌入Tomcat、Jetty或者Undertow等服務器,并且不需要傳統的WAR文件進行部署,也就是說搭建Spring Boot項目并不需要單獨下載Tomcat等傳統的服務器。
同時提供通過Maven(或者Grandle)依賴的starter,這些starter可以直接獲取開發所需的相關包,通過這些starter項目就能以Java Application的形式運行Spring Boot的項目,而無須其他服務器配置。
對于配置,Spring Boot提供Spring框架的最大自動化配置,大量使用自動配置,使得開發者對Spring的配置盡量減少。
此外還提供了一些監測、自動檢測的功能和外部配置,與此同時沒有附加代碼和XML的配置要求。
約定優于配置,這是Spring Boot的主導思想。對于Spring Boot而言,大部分情況下存在默認配置,你甚至可以在沒有任何定義的情況下使用Spring框架,如果需要自定義也只需要在配置文件配置一些屬性便可以,十分便捷。
而對于部署這些項目必需的功能,Spring Boot提供starter的依賴,例如,spring-boot-starter-web捆綁了Spring MVC所依賴的包,spring-boot-starter-tomcat綁定了內嵌的Tomcat,這樣使得開發者能夠盡可能快地搭建開發環境,快速進行開發和部署,這就是Spring Boot的特色。也許作為傳統開發者的你,還未能理解其意義,但這并不要緊。
為了展示Spring Boot的特色,下節將分別展示傳統Spring MVC項目和簡易的Spring Boot入門實例,并進行比較。
傳統Spring MVC和Spring Boot的對比
在傳統的Spring MVC項目開發中,開發一個簡易的Spring MVC項目,需要配置DispatcherServlet,也需要配置Spring IoC的容器。你可以選擇使用web.xml的配置來實現,當然,如果你使用的是Servlet 3.1規范,也可以繼承由Spring MVC提供的AbstractAnnotationConfigDispatcherServletInitializer來配置Spring MVC項目。
這里先給出可以運行的代碼示例,即使你還不熟悉Spring MVC也沒有關系,這里只是為了說明開發比較煩瑣而已,后面將詳談Spring MVC的開發原理。
假設你已經導入需要的Spring和Spring MVC相關的依賴包到工程中,那么就可以開始配置DispatcherServlet了。例如,代碼清單1-1就是通過繼承AbstractAnnotationConfigDispatcherServletInitializer的方式來配置Spring MVC的DispatcherServlet的。
代碼清單1-1 配置Spring MVC
package?com.springboot.springmvc.conf;import? org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer; public?class?MyWebAppInitializer? ?extends?AbstractAnnotationConfigDispatcherServletInitializer?{??//?Spring?IoC容器配置??@Override??protected?Class<?>[]?getRootConfigClasses()?{??//?可以返回Spring的Java配置文件數組??return?new?Class<?>[]?{};??}??//?DispatcherServlet的URI映射關系配置??@Override??protected?Class<?>[]?getServletConfigClasses()?{??//?可以返回Spring的Java配置文件數組??return?new?Class<?>[]?{?WebConfig.class?};??}??//?DispatcherServlet攔截請求匹配??@Override??protected?String[]?getServletMappings()?{??return?new?String[]?{?"*.do"?};??}?? }??注意代碼中加粗的地方。這里引入了一個Java配置文件—— WebConfig.java,它的主要作用是配置Spring MVC的核心類DispatcherServlet的上下文,如代碼清單1-2所示。
?
代碼清單1-2 配置DispatcherServlet的上下文
package?com.springboot.springmvc.conf; import?java.util.ArrayList; import?java.util.List; import?org.springframework.context.annotation.Bean; import?org.springframework.context.annotation.ComponentScan; import?org.springframework.context.annotation.ComponentScan.Filter; import?org.springframework.context.annotation.Configuration; import?org.springframework.context.annotation.FilterType; import?org.springframework.http.MediaType; import?org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import?org.springframework.stereotype.Controller; import?org.springframework.web.servlet.HandlerAdapter; import?org.springframework.web.servlet.ViewResolver; import?org.springframework.web.servlet.config.annotation.EnableWebMvc; import?org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter; import?org.springframework.web.servlet.view.InternalResourceViewResolver;@Configuration //?定義Spring?MVC掃描的包 @ComponentScan(value="com.*",? includeFilters?=?{@Filter(type?=?FilterType.ANNOTATION,value?=?Controller.class)}) //?啟動Spring?MVC配置 @EnableWebMvc public?class?WebConfig?{/****?通過注解@Bean初始化視圖解析器*?*?@return?ViewResolver視圖解析器*/@Bean(name?=?"internalResourceViewResolver")public?ViewResolver?initViewResolver()?{InternalResourceViewResolver?viewResolver?=?new?InternalResourceViewResolver();viewResolver.setPrefix("/WEB-INF/jsp/");viewResolver.setSuffix(".jsp");return?viewResolver;}/***?初始化RequestMappingHandlerAdapter,并加載HTTP的JSON轉換器*?*?@return?RequestMappingHandlerAdapter?對象*/@Bean(name?=?"requestMappingHandlerAdapter")public?HandlerAdapter?initRequestMappingHandlerAdapter()?{//?創建RequestMappingHandlerAdapter適配器RequestMappingHandlerAdapter?rmhd?=?new?RequestMappingHandlerAdapter();//?HTTP?JSON轉換器MappingJackson2HttpMessageConverter?jsonConverter?=?new?MappingJackson2HttpMessageConverter();//?MappingJackson2HttpMessageConverter接收JSON類型消息的轉換mediaType?=?MediaType.APPLICATION_JSON_UTF8;List<MediaType>?mediaTypes?=?new?ArrayList<MediaType>();mediaTypes.add(mediaType);//?加入轉換器的支持類型jsonConverter.setSupportedMediaTypes(mediaTypes);//?給適配器加入JSON轉換器rmhd.getMessageConverters().add(jsonConverter);return?rmhd;} }通過上面的代碼,配置完成Spring MVC的開發環境后,才可以開發Spring MVC控制器Controller,這樣就可以開發一個簡單的控制器(Controller),如代碼清單1-3所示。
代碼清單1-3 開發Spring MVC控制器
package?com.springboot.springmvc.controller;import?java.util.HashMap; import?java.util.Map; import?org.springframework.stereotype.Controller; import?org.springframework.web.bind.annotation.RequestMapping; import?org.springframework.web.bind.annotation.ResponseBody;@Controller public?class?TestController?{@RequestMapping("/test")@ResponseBodypublic?Map<String,?String>?test()?{Map<String,?String>?map?=?new?HashMap<String,?String>();map.put("key",?"value");return?map;} }這樣就完成了一個傳統Spring MVC的開發,但是你還需要第三方服務器,如Tomcat、WebLogic等服務器去部署你的工程。在啟動服務器后,再打開瀏覽器,輸入對應的URL,如項目名稱為SpringMVC則輸入http://localhost:8080/SpringMVC/test.do,就可以得到圖1-1所示的頁面。
?
?圖1-1 測試傳統的Spring MVC項目
從上面來看,傳統的Spring MVC開發需要配置的內容還是比較多的,而且對設計人員要求較高。開發完成后,開發者還需要找到對應的服務器去運行,如Tomcat或者Jetty等,這樣既要進行開發,又要進行配置和部署,工作量還是不少的。
而使用Spring Boot開發后,你就會發現原來一切可以那么簡單。不過在入門階段暫時不需要討論太多的細節問題,這是未來需要討論的問題,所以這里只展示它是如何簡單而已。首先我們在IDE中創建一個Maven工程,并把其名稱定義為Chapter1,這樣就可以看到一個Maven配置文件pom.xml,將其內容修改為如代碼清單1-4所示。
代碼清單1-4 配置Spring Boot依賴環境
<project?xmlns="http://maven.apache.org/POM/4.0.0"? xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0? http://maven.apache.org/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><groupId>springboot</groupId><artifactId>chapter1</artifactId><packaging>war</packaging><version>0.0.1-SNAPSHOT</version><name>chapter1?Maven?Webapp</name><url>http://maven.apache.org</url><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.0.RELEASE</version></parent><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version></properties><dependencies><!--?Spring?Boot?Starter依賴引入?--><!--?AOP包?--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency><!--?Web開發包,將載入Spring?MVC所需要的包,且內嵌tomcat?--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--加載測試依賴包?--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><!--?引入插件?--><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build> </project>從加粗的代碼中可以看到Maven的配置文件引入了多個Spring Boot的starter,Spring Boot會根據Maven配置的starter去尋找對應的依賴,將對應的jar包加載到工程中,而且它還會把綁定的服務器也加載到工程中,這些都不需要你再進行處理。
正如Spring Boot承諾的那樣,綁定服務器,并且實現Spring的盡可能的配置,采用約定優于配置的原則。這里我們只需要開發一個類就可以運行Spring Boot的應用了,為此新建類——Chapter1Main,如代碼清單1-5所示。
代碼清單1-5 開發Spring Boot應用
package?com.springboot.chapter1;import?java.util.HashMap; import?java.util.Map;import?org.springframework.boot.SpringApplication; import?org.springframework.boot.autoconfigure.EnableAutoConfiguration; import?org.springframework.stereotype.Controller; import?org.springframework.web.bind.annotation.RequestMapping; import?org.springframework.web.bind.annotation.ResponseBody;@Controller //?啟用Spring?Boot自動裝配 @EnableAutoConfiguration public?class?Chapter1Main?{@RequestMapping("/test")@ResponseBodypublic?Map<String,?String>?test()?{Map<String,?String>?map?=?new?HashMap<String,?String>();map.put("key",?"value");return?map;}public?static?void?main(String[]?args)?throws?Exception?{SpringApplication.run(Chapter1Main.class,?args);} }好了,這個入門實例已經完結了。如果你沒有接觸過Spring Boot那么你會十分驚訝,這樣就配置完成Spring MVC的內容了嗎?我可以回答你:“是的,已經完成了,現在完全可以使用Java Application的形式去運行類Chapter1Main。”下面是Spring Boot的運行日志:
1?.???____??????????_????????????__?_?_
2?/\\?/?___'_?__?_?_(_)_?__??__?_?\?\?\?\
3(?(?)\___?|?'_?|?'_|?|?'_?\/?_`?|?\?\?\?\
4?\\/??___)|?|_)|?|?|?|?|?||?(_|?|??)?)?)?)
5??'??|____|?.__|_|?|_|_|?|_\__,?|?/?/?/?/
6?=========|_|==============|___/=/_/_/_/
7?::?Spring?Boot?::????????(v2.0.0.RELEASE)
8
92018-03-01?22:21:55.843??INFO?16324?---?[???????????main]?
10com.springboot.chapter1.Chapter1Main?????:?
11Starting?Chapter1Main?on?AFOIF-703271542?with?PID?16324?
12(G:\springboot\v2\chapter1\target\classes?started?by?Administrator?in?
13G:\springboot\v2\chapter1)
14......
152018-03-01?22:21:57.270??INFO?16324?---?[???????????main]?
16s.w.s.m.m.a.RequestMappingHandlerMapping?:?
17Mapped?"{[/test]}"?onto?public?java.util.Map<java.lang.String,?java.lang.String>?
18com.springboot.chapter1.Chapter1Main.test()
19......
202018-03-01?22:21:57.270??INFO?16324?---?[???????????main]?
21com.springboot.chapter1.Chapter1Main?:?Started?Chapter1Main?in?1.845?seconds?(JVM?running?for?2.143)
22
從日志中可以看到,Tomcat已經啟動,并且將我們開發的Chapter1Main作為Spring MVC的控制器加載進來了,也將對應的路徑(/test)映射到開發的test方法上。因此,接下來就可以進行測試了。打開瀏覽器,在地址欄輸入http://localhost:8080/test,可以看到如圖1-2所示的結果。
?
圖1-2Spring Boot運行結果
與傳統的Spring MVC是不是很不一樣呢?從上面的對比可以看出,Spring Boot 允許直接進行開發,這就是它的優勢。在傳統所需要配置的地方,Spring Boot都進行了約定,也就是你可以直接以Spring Boot約定的方式進行開發和運行你的項目。
當你需要修改配置的時候,它也提供了一些快速配置的約定,猶如它所承諾的那樣,盡可能地配置好Spring項目和綁定對應的服務器,使得開發人員的配置更少,更加直接地開發項目。
對于那些微服務而言,更喜歡的就是這樣能夠快速搭建環境的項目,而Spring Boot提供了這種可能性,同時Spring Boot還提供了監控的功能。
隨著云技術的到來,微服務成了市場的熱點,于是代表Java微服務時代的Spring Boot微服務開發的時代已經到來,結合Spring Cloud后它還能很方便地構建分布式系統開發,滿足大部分無能力單獨開發分布式架構的企業所需,所以這無疑是激動人心的技術。
總結
以上是生活随笔為你收集整理的Spring Boot 2.X 来临,本文将带你起飞的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OpenCV 新版 4.5.1 发布!
- 下一篇: TC275-中断