構建微服務:Spring boot 入門篇

?

?

Spring官方網站本身使用Spring框架開發,隨著功能以及業務邏輯的日益復雜,應用伴隨著大量的XML配置文件以及復雜的Bean依賴關系。隨著Spring 3.0的發布,Spring IO團隊逐漸開始擺脫XML配置文件,并且在開發過程中大量使用“約定優先配置”(convention over configuration)的思想來擺脫Spring框架中各類繁復紛雜的配置(即時是Java Config)。

Spring Boot正是在這樣的一個背景下被抽象出來的開發框架,它本身并不提供Spring框架的核心特性以及擴展功能,只是用于快速、敏捷地開發新一代基于Spring框架的應用程序。也就是說,它并不是用來替代Spring的解決方案,而是和Spring框架緊密結合用于提升Spring開發者體驗的工具。同時它集成了大量常用的第三方庫配置(例如Jackson, JDBC, Mongo, Redis, Mail等等),Spring Boot應用中這些第三方庫幾乎可以零配置的開箱即用(out-of-the-box),大部分的Spring Boot應用都只需要非常少量的配置代碼,開發者能夠更加專注于業務邏輯。

Hello World

傳統基于Spring的Java Web應用,需要配置web.xml,?applicationContext.xml,將應用打成war包放入應用服務器(Tomcat, Jetty等)中并運行。如果基于Spring Boot,這一切都將變得簡單:

以Maven項目為例,首先引入Spring Boot的開發依賴:

?

編寫一個類包含處理HTTP請求的方法以及一個main()函數:

?

啟動main函數后,在控制臺中可以發現啟動了一個Tomcat容器,一個基于Spring MVC的應用也同時啟動起來,這時訪問[[http://localhost:8080](http://localhost:8080)]([http://localhost:8080](http://localhost:8080))就可以看到Hello World!出現在瀏覽器中了。

Spring Boot初探

在Maven依賴中引入了spring-boot-starter-web,它包含了Spring Boot預定義的一些Web開發的常用依賴:

  • spring-web,?spring-webmvc?Spring WebMvc框架
  • tomcat-embed-*?內嵌Tomcat容器
  • jackson?處理json數據
  • spring-*?Spring框架
  • spring-boot-autoconfigure?Spring Boot提供的自動配置功能

Java代碼中沒有任何配置,和傳統的Spring應用相比,多了兩個我們不認識的符號:

  • @EnableAutoConfiguration
  • SpringApplication

它們都是由Spring Boot框架提供。在SpringApplication.run()方法執行后,Spring Boot的autoconfigure發現這是一個Web應用(根據類路徑上的依賴確定),于是在內嵌的Tomcat容器中啟動了一個Spring的應用上下文,并且監聽默認的tcp端口8080(默認約定)。同時在Spring Context中根據默認的約定配置了Spring WebMvc:

  • Servlet容器默認的Context路徑是/
  • DispatherServlet匹配的路徑(servlet-mapping中的url-patterns)是/*
  • @ComponentScan路徑被默認設置為SampleController的同名package,也就是該package下的所有@Controller@Service,?@Component,?@Repository都會被實例化后并加入Spring Context中。

沒有一行配置代碼、也沒有web.xml。基于Spring Boot的應用在大多數情況下都不需要我們去顯式地聲明各類配置,而是將最常用的默認配置作為約定,在不聲明的情況下也能適應大多數的開發場景。

實例:數據庫訪問

除了最基本的Web框架,另一種非常普遍的開發場景是訪問數據庫。在傳統的Spring應用中,訪問數據庫我們需要配置:

  • 類路徑上添加數據庫訪問驅動
  • 實例化DataSource對象,指定數據庫url,?username,?password等信息
  • 注入JdbcTemplate對象,如果使用HibernateMybatis等框架,還需要進一步配置框架信息

在Spring Boot中,上述過程會被簡化。首先在Maven項目依賴中定義:

spring-boot-starter-web-jdbc引入了spring-jdbc依賴,h2是一個內存關系型數據庫。在引入了這些依賴并啟動Spring Boot應用程序后,autoconfigure發現spring-jdbc位于類路徑中,于是:

  • 根據類路徑上的JDBC驅動類型(這里是h2,預定義了derby,?sqlite,?mysql,?oracle,?sqlserver等等),創建一個DataSource連接池對象,本例中的h2是內存數據庫,無需任何配置,如果是mysql,?oracle等類型的數據庫需要開發者配置相關信息。
  • 在Spring Context中創建一個JdbcTemplate對象(使用DataSource初始化)

接下來開發者的工作就非常簡單了,在業務邏輯中直接引入JdbcTemplate即可:

除了spring-jdbc,Spring Boot還能夠支持JPA,以及各種NoSQL數據庫——包括MongoDB,Redis,全文索引工具elasticsearch,?solr等等。

配置

Spring Boot最大的特色是“約定優先配置”,大量的默認配置對開發者十分的友好。但是在實際的應用開發過程中,默認配置不可能滿足所有場景,同時用戶也需要配置一些必須的配置項——例如數據庫連接信息。Spring Boot的配置系統能夠讓開發者快速的覆蓋默認約定,同時支持Properties配置文件和YAML配置文件兩種格式,默認情況下Spring Boot加載類路徑上的application.propertiesapplication.yml文件,例如:

通過portaddress可以修改服務器監聽的地址和端口,sessionTimeout配置session過期時間(再也不用修改web.xml了,因為它根本不存在)。同時如果在生產環境中使用內嵌Tomcat,當然希望能夠配置它的日志、線程池等信息,這些現在都可以通過Spring Boot的屬性文件配置,而不再需要再對生產環境中的Tomcat實例進行單獨的配置管理了。

@EnableAutoCongiguration

從Spring 3.0開始,為了替代繁瑣的XML配置,引入了@Enable...注解對@Configuration類進行修飾以達到和XML配置相同的效果。想必不少開發者已經使用過類似注解:

  • @EnableTransactionManagement開啟Spring事務管理,相當于XMl中的<tx:*>
  • @EnableWebMvc使用Spring MVC框架的一些默認配置
  • @EnableScheduling會初始化一個Scheduler用于執行定時任務和異步任務

Spring Boot提供的@EnableAutoCongiguration似乎功能更加強大,一旦加上,上述所有的配置似乎都被包含進來而無需開發者顯式聲明。它究竟是如何做到的呢,先看看它的定義:

EnableAutoConfigurationImportSelector使用的是spring-core模塊中的SpringFactoriesLoader#loadFactoryNames()方法,它的作用是在類路徑上掃描META-INF/spring.factories文件中定義的類:

實際上這就是Spring Boot會自動配置的一些對象,例如前面提到的Web框架由EmbeddedServletContainerAutoConfiguration,?DispatcherServletAutoConfiguration,?ServerPropertiesAutoConfiguration等配置完成,而DataSource的自動配置則是由DataSourceAutoConfiguration完成。現在我們以Mongo的配置MongoAutoConfiguration為例,來探索Spring Boot是如何完成這些配置的:

首先這是一個Spring的配置@Configuration,它定義了我們訪問Mongo需要的@Bean,如果這個@Configuration被Spring Context掃描到,那么Context中自然也就有兩個一個Mongo對象能夠直接為開發者所用。

但是注意到其它幾個Spring注解:

  • @ConditionOnClass表明該@Configuration僅僅在一定條件下才會被加載,這里的條件是Mongo.class位于類路徑上
  • @EnableConfigurationProperties將Spring Boot的配置文件(application.properties)中的spring.data.mongodb.*屬性映射為MongoProperties并注入到MongoAutoConfiguration中。
  • @ConditionalOnMissingBean說明Spring Boot僅僅在當前上下文中不存在Mongo對象時,才會實例化一個Bean。這個邏輯也體現了Spring Boot的另外一個特性——自定義的Bean優先于框架的默認配置,我們如果顯式的在業務代碼中定義了一個Mongo對象,那么Spring Boot就不再創建。

接下來看一看MongoProperties

顯然,它就是以spring.data.mongodb作為前綴的屬性,然后通過名字直接映射為對象的屬性,同時還包含了一些默認值。如果不配置,那么mongo.uri就是mongodb://localhost/test

Production特性

從前面的例子可以看出,Spring Boot能夠非常快速的做出一些原型應用,但是它同樣可以被用于生產環境。為了添加生產環境特性支持,需要在Maven依賴中引入:

?

加入actuator依賴后,應用啟動后會創建一些基于Web的Endpoint:

  • /autoconfig,用來查看Spring Boot的框架自動配置信息,哪些被自動配置,哪些沒有,原因是什么。
  • /beans,顯示應用上下文的Bean列表
  • /dump,顯示線程dump信息
  • /health,應用健康狀況檢查
  • /metrics
  • /shutdown, 默認沒有打開
  • /trace

總結

Spring Boot是新一代Spring應用的開發框架,它能夠快速的進行應用開發,讓人忘記傳統的繁瑣配置,更加專注于業務邏輯。現在Spring官方文檔中所有的Guide中的例子都是使用Spring Boot進行構建,這也是一個學習Spring, Spring Boot非常好的地方。

轉載于:https://www.cnblogs.com/fu512/p/7002345.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/395401.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/395401.shtml
英文地址,請注明出處:http://en.pswp.cn/news/395401.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

img 加載 svg占位符_如何使用SVG作為占位符以及其他圖像加載技術

img 加載 svg占位符by Jos M. Prez由JosM.Prez 如何使用SVG作為占位符以及其他圖像加載技術 (How to use SVG as a Placeholder, and Other Image Loading Techniques) I’m passionate about image performance optimisation and making images load fast on the web. One of…

hibernate 注解

參考鏈接地址&#xff1a;https://blog.csdn.net/wx5040257/article/details/78697119 主鍵生成策略:https://www.cnblogs.com/ph123/p/5692194.html 注解轉載于:https://www.cnblogs.com/wangxuekui/p/10287647.html

iOS - UIScrollView

前言 NS_CLASS_AVAILABLE_IOS(2_0) interface UIScrollView : UIView <NSCoding>available(iOS 2.0, *) public class UIScrollView : UIView, NSCoding 移動設備的屏幕大小是極其有限的&#xff0c;因此直接展示在用戶眼前的內容也相當有限。當展示的內容較多&…

機器學習的展望

現階段越來越多的投入到機器學習的熱潮中來&#xff0c;有的人很是興奮&#xff0c;認為這是一場新和革命&#xff0c;一場終極人工智能來臨的前夜。也有人表示悲觀&#xff0c;認為不僅機器學習不代表終極人工智能&#xff0c; 也還非常不成熟。 大量的新生代投入到這個領域&a…

BZOJ3453 XLkxc(拉格朗日插值)

顯然f(i)是一個k2項式&#xff0c;g(x)是f(i)的前綴和&#xff0c;則顯然其是k3項式&#xff0c;插值即可。最后要求的東西大膽猜想是個k4項式繼續插值就做完了。注意2p>maxint…… #include<iostream> #include<cstdio> #include<cmath> #include<cs…

電郵地址_利用這些簡單的技巧來充分利用電子郵件的強大功能

電郵地址Let’s talk about some email features that are surprisingly under-used, and that can really benefit you — if you know how to use them. This article is suitable for both users and developers who want to become email Jedi.讓我們討論一些電子郵件功能&…

inputstream重新賦值之前需要close嗎_變量提升真的搞懂了嗎?打臉的一道題

變量提升真的搞懂了嗎&#xff1f;打臉的一道題我們知道JS代碼在執行之前&#xff0c;會做一系列的事情&#xff0c;其中就包括變量提升&#xff0c;原本以為把變量提升搞懂的我&#xff08;因為這兩天一直在研究變量提升&#xff0c;自我感覺已經很良好了&#xff0c;哈哈哈&a…

html5語義化 兼容,HTML5語義化標簽,兼容性問題

HTML5不僅僅作為HTML標記語言的一個最新版本&#xff0c;更重要的是它制定了web應用開發的一系列標準&#xff0c;成為第一個將web做為應用開發平臺的HTML語言。HTML5定義了一系列的新元素&#xff0c;如新語義化標簽&#xff0c;智能表單&#xff0c;多媒體標簽等&#xff0c;…

Swift之 vm10虛擬機安裝Mac OS X10.10教程

VM10裝Mac OS X 10.9.3及更新到Mac OS X 10.10,讓你的windows也能玩Swift 。 近期WWDC放出終極大招——新的編程語言Swift(雨燕),導致一大波程序猿的圍觀和躍躍欲試。當然了,工欲善其事,必先利其器,所以對于那些沒有Mac又想要嘗鮮的小伙伴肯定非常為難。可是&#xff0c;請放…

如何使用json開發web_如何通過使用JSON Web令牌簡化應用程序的身份驗證

如何使用json開發webby Sudheesh Shetty由Sudheesh Shetty 如何通過使用JSON Web令牌簡化應用程序的身份驗證 (How to simplify your app’s authentication by using JSON Web Token) Every application we come across today implements security measures so that the user…

c++ 實現錄音并且指定到文件_通話自動錄音,留下美好回憶,記錄完整錄音證據...

手機通話&#xff0c;如果自動錄音多好&#xff0c;許多人與我一樣抱有這個想法。記得華為Android版本5.0時代&#xff0c;手機沒有自動錄音功能&#xff0c;我一直到網上下載自動通話錄音軟件&#xff0c;有時甚至是下載ROOT版的帶自動通話功能的EMUI版本進行刷機安裝。那個時…

2639-Bone Collector II (01背包之第k優解)

題目鏈接&#xff1a; http://acm.hdu.edu.cn/showproblem.php?pid2639 求第k優解的關鍵代碼&#xff1a; 用兩個數組記錄兩種狀態&#xff08;選擇或不選擇&#xff09;&#xff0c;并且只要記錄前k次。在這兩個數組中都是前k次可能的最優解。所以我們只要把這兩個數組做比較…

html自動按鍵,VBS腳本和HTML DOM自動操作網頁

本來是想通過JS實現對其他頁面的控制&#xff0c;發現跨域無法獲取頁面DOM來操作。接著考慮bat&#xff0c;發現也實現不了&#xff0c;于是想到vbs。vbs還是很強大啊&#xff0c;病毒之類很多都是vbs腳本啊。vbs打開瀏覽器&#xff0c;然后通過dom來操作頁面&#xff0c;可以實…

opencv在同一窗口打印多張圖片

首先&#xff0c;由于cv2處理的圖片是通過ndarray的格式操作的&#xff0c;也就是說通過array的拼接就可以實現圖片的拼接&#xff0c;那么之后就可以通過簡單的imshow將合并的圖片打印從而達到在一個窗口中顯示多張圖片的目的。 import cv2 import numpy as npimg1 cv2.imrea…

dj打碟怎么學_學DJ打碟 - Rane聲卡連接

上一篇內容中&#xff0c;老師講過在學DJ打碟的時候&#xff0c;是離不開對軟件方面的操作&#xff0c;其實每一個學習過程&#xff0c;當你學會之后&#xff0c;在“回頭看”的時候&#xff0c;都會覺得&#xff1a;原來學DJ打碟這么簡單啊&#xff0c;這就是已經學習過的人會…

微信企業號第三方應用開發[一]——創建套件

注&#xff1a;文中綠色部分為摘自微信官方文檔 第三方應用提供給企業的是一個應用&#xff0c;但是應用必須在套件下創建&#xff0c;所以第一步是要創建套件。 注冊成為應用提供商&#xff0c;必須輸入以下信息&#xff1a; 信息項要求及說明企業Logo應用提供商的企業Logo&am…

advanced east_SpriteKit Advanced —如何構建2,5D游戲(第二部分)

advanced eastby Luke Konior盧克科尼爾(Luke Konior) SpriteKit Advanced —如何構建2,5D游戲(第二部分) (SpriteKit Advanced — How to build a 2,5D game (Part II)) 介紹 (Intro) This article shows how to write basic shaders in the SpriteKit. It’s split into two…

html原生上傳,一個基于HTML5及原生JS的文件上傳組件--JohnUploader

運行效果圖一、組件介紹基本特點基于HTML5的FileReader和FormData可以完成多文件選擇&#xff0c;并預覽完成文件的異步上傳原生XHR對象&#xff0c;適配多瀏覽器代碼class JohnUploader{url;fileField;vollay;/**** param url 文件上傳的地址* param fileField 一個"文件…

[20170617]vim中調用sqlplus.txt

[20170617]vim中調用sqlplus.txt --//以前寫過一篇emacs下調用sqlplus的文章,一直想學emacs,受限制自己掌握vim,對學習它沒有興趣,原鏈接如下: --//http://blog.itpub.net/267265/viewspace-1309032/ --//實際上vim也有插件連接數據庫,我覺得不好用,一直沒這樣用. --//今天在整…

centos redis驗證_centos7中安裝、配置、驗證、卸載redis

本文介紹在centos7中安裝、配置、驗證、卸載redis等操作&#xff0c;以及在使用redis中的一些注意事項。一 安裝redis1 創建redis的安裝目錄利用以下命令&#xff0c;切換到/usr/local路徑cd /usr/local鍵入以下命令&#xff0c;新建一個redis目錄&#xff0c;用于放置redis軟件…