javascript
Spring Boot 2.X 来临,本文将带你起飞
轉(zhuǎn)載自? ?Spring Boot 2.X 來臨,本文將帶你起飛
當前互聯(lián)網(wǎng)技術(shù)盛行,以Spring 框架為主導的Java 互聯(lián)網(wǎng)技術(shù)成了主流,而基于Spring 技術(shù)衍生出來的Spring Boot,采用了“約定優(yōu)于配置”的思想,極大地簡化了Spring 框架的開發(fā)。
隨著近些年來微服務(wù)技術(shù)的流行,Spring Boot 也成了時下炙手可熱的熱點技術(shù)。2017 年9 月,Spring 框架出現(xiàn)了重大版本升級,從4.x 版本升級為了5.x 版本,隨著這次升級,Spring Boot的版本也在2018年3月從1.x升級到了2.x。
Spring Boot的優(yōu)點
談到Spring Boot,就讓我們先來了解它的優(yōu)點。依據(jù)官方的文檔,Spring Boot的優(yōu)點如下:
-
創(chuàng)建獨立的Spring應(yīng)用程序;
-
嵌入的Tomcat、Jetty或者Undertow,無須部署WAR文件;
-
允許通過Maven來根據(jù)需要獲取starter;
-
盡可能地自動配置Spring;
-
提供生產(chǎn)就緒型功能,如指標、健康檢查和外部配置;
-
絕對沒有代碼生成,對XML沒有要求配置。
這段描述告訴我們,首先Spring Boot是一個基于Spring框架搭建起來的應(yīng)用,其次它會嵌入Tomcat、Jetty或者Undertow等服務(wù)器,并且不需要傳統(tǒng)的WAR文件進行部署,也就是說搭建Spring Boot項目并不需要單獨下載Tomcat等傳統(tǒng)的服務(wù)器。
同時提供通過Maven(或者Grandle)依賴的starter,這些starter可以直接獲取開發(fā)所需的相關(guān)包,通過這些starter項目就能以Java Application的形式運行Spring Boot的項目,而無須其他服務(wù)器配置。
對于配置,Spring Boot提供Spring框架的最大自動化配置,大量使用自動配置,使得開發(fā)者對Spring的配置盡量減少。
此外還提供了一些監(jiān)測、自動檢測的功能和外部配置,與此同時沒有附加代碼和XML的配置要求。
約定優(yōu)于配置,這是Spring Boot的主導思想。對于Spring Boot而言,大部分情況下存在默認配置,你甚至可以在沒有任何定義的情況下使用Spring框架,如果需要自定義也只需要在配置文件配置一些屬性便可以,十分便捷。
而對于部署這些項目必需的功能,Spring Boot提供starter的依賴,例如,spring-boot-starter-web捆綁了Spring MVC所依賴的包,spring-boot-starter-tomcat綁定了內(nèi)嵌的Tomcat,這樣使得開發(fā)者能夠盡可能快地搭建開發(fā)環(huán)境,快速進行開發(fā)和部署,這就是Spring Boot的特色。也許作為傳統(tǒng)開發(fā)者的你,還未能理解其意義,但這并不要緊。
為了展示Spring Boot的特色,下節(jié)將分別展示傳統(tǒng)Spring MVC項目和簡易的Spring Boot入門實例,并進行比較。
傳統(tǒng)Spring MVC和Spring Boot的對比
在傳統(tǒng)的Spring MVC項目開發(fā)中,開發(fā)一個簡易的Spring MVC項目,需要配置DispatcherServlet,也需要配置Spring IoC的容器。你可以選擇使用web.xml的配置來實現(xiàn),當然,如果你使用的是Servlet 3.1規(guī)范,也可以繼承由Spring MVC提供的AbstractAnnotationConfigDispatcherServletInitializer來配置Spring MVC項目。
這里先給出可以運行的代碼示例,即使你還不熟悉Spring MVC也沒有關(guān)系,這里只是為了說明開發(fā)比較煩瑣而已,后面將詳談Spring MVC的開發(fā)原理。
假設(shè)你已經(jīng)導入需要的Spring和Spring MVC相關(guān)的依賴包到工程中,那么就可以開始配置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配置文件數(shù)組??return?new?Class<?>[]?{};??}??//?DispatcherServlet的URI映射關(guān)系配置??@Override??protected?Class<?>[]?getServletConfigClasses()?{??//?可以返回Spring的Java配置文件數(shù)組??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轉(zhuǎn)換器*?*?@return?RequestMappingHandlerAdapter?對象*/@Bean(name?=?"requestMappingHandlerAdapter")public?HandlerAdapter?initRequestMappingHandlerAdapter()?{//?創(chuàng)建RequestMappingHandlerAdapter適配器RequestMappingHandlerAdapter?rmhd?=?new?RequestMappingHandlerAdapter();//?HTTP?JSON轉(zhuǎn)換器MappingJackson2HttpMessageConverter?jsonConverter?=?new?MappingJackson2HttpMessageConverter();//?MappingJackson2HttpMessageConverter接收JSON類型消息的轉(zhuǎn)換mediaType?=?MediaType.APPLICATION_JSON_UTF8;List<MediaType>?mediaTypes?=?new?ArrayList<MediaType>();mediaTypes.add(mediaType);//?加入轉(zhuǎn)換器的支持類型jsonConverter.setSupportedMediaTypes(mediaTypes);//?給適配器加入JSON轉(zhuǎn)換器rmhd.getMessageConverters().add(jsonConverter);return?rmhd;} }通過上面的代碼,配置完成Spring MVC的開發(fā)環(huán)境后,才可以開發(fā)Spring MVC控制器Controller,這樣就可以開發(fā)一個簡單的控制器(Controller),如代碼清單1-3所示。
代碼清單1-3 開發(fā)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;} }這樣就完成了一個傳統(tǒng)Spring MVC的開發(fā),但是你還需要第三方服務(wù)器,如Tomcat、WebLogic等服務(wù)器去部署你的工程。在啟動服務(wù)器后,再打開瀏覽器,輸入對應(yīng)的URL,如項目名稱為SpringMVC則輸入http://localhost:8080/SpringMVC/test.do,就可以得到圖1-1所示的頁面。
?
?圖1-1 測試傳統(tǒng)的Spring MVC項目
從上面來看,傳統(tǒng)的Spring MVC開發(fā)需要配置的內(nèi)容還是比較多的,而且對設(shè)計人員要求較高。開發(fā)完成后,開發(fā)者還需要找到對應(yīng)的服務(wù)器去運行,如Tomcat或者Jetty等,這樣既要進行開發(fā),又要進行配置和部署,工作量還是不少的。
而使用Spring Boot開發(fā)后,你就會發(fā)現(xiàn)原來一切可以那么簡單。不過在入門階段暫時不需要討論太多的細節(jié)問題,這是未來需要討論的問題,所以這里只展示它是如何簡單而已。首先我們在IDE中創(chuàng)建一個Maven工程,并把其名稱定義為Chapter1,這樣就可以看到一個Maven配置文件pom.xml,將其內(nèi)容修改為如代碼清單1-4所示。
代碼清單1-4 配置Spring Boot依賴環(huán)境
<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開發(fā)包,將載入Spring?MVC所需要的包,且內(nèi)嵌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會根據(jù)Maven配置的starter去尋找對應(yīng)的依賴,將對應(yīng)的jar包加載到工程中,而且它還會把綁定的服務(wù)器也加載到工程中,這些都不需要你再進行處理。
正如Spring Boot承諾的那樣,綁定服務(wù)器,并且實現(xiàn)Spring的盡可能的配置,采用約定優(yōu)于配置的原則。這里我們只需要開發(fā)一個類就可以運行Spring Boot的應(yīng)用了,為此新建類——Chapter1Main,如代碼清單1-5所示。
代碼清單1-5 開發(fā)Spring Boot應(yīng)用
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);} }好了,這個入門實例已經(jīng)完結(jié)了。如果你沒有接觸過Spring Boot那么你會十分驚訝,這樣就配置完成Spring MVC的內(nèi)容了嗎?我可以回答你:“是的,已經(jīng)完成了,現(xiàn)在完全可以使用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已經(jīng)啟動,并且將我們開發(fā)的Chapter1Main作為Spring MVC的控制器加載進來了,也將對應(yīng)的路徑(/test)映射到開發(fā)的test方法上。因此,接下來就可以進行測試了。打開瀏覽器,在地址欄輸入http://localhost:8080/test,可以看到如圖1-2所示的結(jié)果。
?
圖1-2Spring Boot運行結(jié)果
與傳統(tǒng)的Spring MVC是不是很不一樣呢?從上面的對比可以看出,Spring Boot 允許直接進行開發(fā),這就是它的優(yōu)勢。在傳統(tǒng)所需要配置的地方,Spring Boot都進行了約定,也就是你可以直接以Spring Boot約定的方式進行開發(fā)和運行你的項目。
當你需要修改配置的時候,它也提供了一些快速配置的約定,猶如它所承諾的那樣,盡可能地配置好Spring項目和綁定對應(yīng)的服務(wù)器,使得開發(fā)人員的配置更少,更加直接地開發(fā)項目。
對于那些微服務(wù)而言,更喜歡的就是這樣能夠快速搭建環(huán)境的項目,而Spring Boot提供了這種可能性,同時Spring Boot還提供了監(jiān)控的功能。
隨著云技術(shù)的到來,微服務(wù)成了市場的熱點,于是代表Java微服務(wù)時代的Spring Boot微服務(wù)開發(fā)的時代已經(jīng)到來,結(jié)合Spring Cloud后它還能很方便地構(gòu)建分布式系統(tǒng)開發(fā),滿足大部分無能力單獨開發(fā)分布式架構(gòu)的企業(yè)所需,所以這無疑是激動人心的技術(shù)。
總結(jié)
以上是生活随笔為你收集整理的Spring Boot 2.X 来临,本文将带你起飞的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OpenCV 新版 4.5.1 发布!
- 下一篇: Spring Cloud 升级最新 Fi