? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?整理匯編者:文思
SpringBoot是伴隨著Spring4.0誕生的。
Spring?Boot主要特性:
(1)遵循“習(xí)慣優(yōu)于配置”的原則,使用Spring Boot只需要很少的配置,大部分的時(shí)候我們直接使用默認(rèn)的配置即可础拨。
(2)項(xiàng)目快速搭建闸与,可以無需配置的自動整合第三方的框架列牺。
(3)可以完全不使用XML配置文件涉兽,只需要自動配置和Java Config。
(4)內(nèi)嵌Servlet容器腹鹉,降低了對環(huán)境的要求,可以使用命令直接執(zhí)行項(xiàng)目敷硅,應(yīng)用可用jar包執(zhí)行:java -jar功咒。
(5)提供了starter POM,能夠非常方便的進(jìn)行包管理,很大程度上減少了jar hell或者dependencyhell愉阎。
(6)運(yùn)行中應(yīng)用狀態(tài)的監(jiān)控。
(7)對主流開發(fā)框架的無配置集成力奋。
(8)與云計(jì)算的天然繼承榜旦。
Spring?Boot核心功能:
(1)獨(dú)立運(yùn)行的Spring項(xiàng)目。
(2)內(nèi)嵌的Servlet容器景殷,內(nèi)嵌容器溅呢,使得我們可以執(zhí)行運(yùn)行項(xiàng)目的主程序main函數(shù),使項(xiàng)目的快速運(yùn)行猿挚。
(3)提供starter簡化Manen配置咐旧,Spring?Boot提供了一系列的starter pom用來簡化我們的Maven依賴,下邊是創(chuàng)建一個(gè)web項(xiàng)目中自動包含的依賴,使用的starter pom為:spring-boot-starter-web绩蜻,代替?zhèn)鹘y(tǒng)方式下的若干pom依賴铣墨。
--------------------------------------------------------------------------------------------------------------------------------------------------------------------
框架展開:
從字面理解,Boot是引導(dǎo)的意思办绝,因此SpringBoot幫助開發(fā)者快速搭建Spring框架:
Spring Boot更多的是采用Java?Config的方式伊约,對Spring進(jìn)行配置:
部署簡單:
監(jiān)控簡單:采用了spring-boot-start-actuator之后,直接以REST的方式孕蝉,獲取進(jìn)程的運(yùn)行期性能參數(shù)
不足之處:
在實(shí)踐Spring Boot時(shí)學(xué)習(xí)重點(diǎn)碱妆,或者說思維方式改變的重點(diǎn)在于:
1)對于REST的理解,這一點(diǎn)尤為重要昔驱,需要從設(shè)計(jì)疹尾、開發(fā)多個(gè)角色達(dá)成共識,很多時(shí)候都是對于HTTP 1.1協(xié)議以及REST的精髓不理解骤肛,導(dǎo)致REST被「盲用」而產(chǎn)生一些不好的效果纳本。
2)對于YAML的理解和對于JavaConfig的理解,這兩點(diǎn)相對較為簡單腋颠,本質(zhì)上是簡化了xml文件繁成,并提供等價(jià)的配置表述能力。
總結(jié):
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
框架概述:
從最根本上來講淑玫,Spring?Boot就是一些庫的集合,為了簡化依賴圖巾腕,Boot的功能是模塊化的,通過導(dǎo)入Boot所謂的“starter”模塊絮蒿,可以將許多的依賴添加到工程之中,為了更容易地管理依賴版本和使用默認(rèn)配置尊搬,框架提供了一個(gè)parent POM,工程可以繼承它土涝。
其中:
在Maven依賴中引入了spring-boot-starter-web佛寿,它包含了Spring Boot預(yù)定義的一些Web開發(fā)的常用依賴:
spring-web,spring-webmvcSpring WebMvc框架
tomcat-embed-*內(nèi)嵌Tomcat容器
jackson處理json數(shù)據(jù)
spring-*Spring框架
spring-boot-autoconfigure:Spring Boot提供的自動配置功能
為了快速地搭建和運(yùn)行Boot工程,Pivotal提供了稱之為“Spring?Initializr”的web界面但壮,用于下載預(yù)先定義好的Maven或Gradle構(gòu)建配置,訪問http://start.spring.io/即可.我們也可以使用Lazybones模板實(shí)現(xiàn)快速起步(略)冀泻。
應(yīng)用可以通過spring run App.groovy命令在Spring Boot CLI中運(yùn)行常侣。Boot會分析文件并根據(jù)各種“編譯器自動配置(compiler auto-configuration)”標(biāo)示符來確定其意圖是生成Web應(yīng)用命贴。然后但两,它會在一個(gè)嵌入式的Tomcat中啟動Spring應(yīng)用上下文,并且使用默認(rèn)的8080端口羽嫡。打開瀏覽器并導(dǎo)航到給定的URL肢专,隨后將會加載一個(gè)頁面并展現(xiàn)簡單的文本響應(yīng):“hello”巾乳。提供默認(rèn)應(yīng)用上下文以及嵌入式容器的這些過程,能夠讓開發(fā)人員更加關(guān)注于開發(fā)應(yīng)用以及業(yè)務(wù)邏輯鸟召,從而不用再關(guān)心繁瑣的樣板式配置胆绊。日常開發(fā)中一般使用:run as -->java application或者spring boot app
直接運(yùn)行MainApplication和在BootDashboard中運(yùn)行是一樣的
@SpringBootApplication
@EnableAutoConfiguration
@EnableDiscoveryClient
@EnableFeignClients
@RestController
public class MainApplication {
? ? ? ?public staticvoid main(String[] args) {
? ? ? ? ? ? ?SpringApplication.run(MainApplication.class,args);
? ? ? ?}
? ? ? @RequestMapping("/")
? ? ? ? ?public Stringindex(){
? ? ? ? ? ? ? ?return "hello world!";
? ? ? ? ? }
? ? @RequestMapping("/test")
? ? ?public Stringtest(){
? ? ? ? ?return "test MainApplication!";
? ? ?}
在Application類上的@EnableAutoConfiguration注解會告知Boot要采用一種特定的方式來對應(yīng)用進(jìn)行配置。這種方法會將其他樣板式的配置均假設(shè)為框架默認(rèn)的約定欧募,因此能夠聚焦于如何盡快地使應(yīng)用準(zhǔn)備就緒以便運(yùn)行起來压状。Application類是可運(yùn)行的,因此跟继,當(dāng)我們以Java Application的方式運(yùn)行這個(gè)類時(shí)种冬,就能啟動該應(yīng)用及其嵌入式的容器,這樣也能實(shí)現(xiàn)即時(shí)地開發(fā)舔糖。
Java代碼中沒有任何配置娱两,和傳統(tǒng)的Spring應(yīng)用相比,多了兩個(gè)我們不認(rèn)識的符號:
@EnableAutoConfiguration和@SpringApplication
它們都是由Spring?Boot框架提供金吗。在SpringApplication.run()方法執(zhí)行后十兢,Spring Boot的autoconfigure發(fā)現(xiàn)這是一個(gè)Web應(yīng)用(根據(jù)類路徑上的依賴確定),Spring?Context中根據(jù)默認(rèn)的約定配置了Spring WebMvc:
Servlet容器默認(rèn)的Context路徑是/
DispatherServlet匹配的路徑(servlet-mapping中的url-patterns)是/*
@ComponentScan路徑被默認(rèn)設(shè)置為SampleController的同名package摇庙,也就是該package下的所有@Controller旱物,@Service,@Component,@Repository都會被實(shí)例化后并加入Spring Context中
沒有一行配置代碼、也沒有web.xml卫袒∠海基于Spring Boot的應(yīng)用在大多數(shù)情況下都不需要我們?nèi)ワ@式地聲明各類配置,而是將最常用的默認(rèn)配置作為約定夕凝,在不聲明的情況下也能適應(yīng)大多數(shù)的開發(fā)場景宝穗。
開發(fā)微服務(wù)
Boot對Spring應(yīng)用的開發(fā)進(jìn)行了簡化,提供了模塊化方式導(dǎo)入依賴的能力码秉,強(qiáng)調(diào)了開發(fā)RESTful Web服務(wù)的功能并提供了生成可運(yùn)行jar的能力逮矛,這一切都清晰地表明在開發(fā)可部署的微服務(wù)方面Boot框架是一個(gè)強(qiáng)大的工具。
在開發(fā)微服務(wù)應(yīng)用時(shí)泡徙,需要特別注意的一點(diǎn)是使用了@RequestMapping注解橱鹏。這不是Boot特定的注解。不過堪藐,因?yàn)锽oot安裝了自己的端點(diǎn)以監(jiān)控應(yīng)用的性能莉兰、健康情況以及配置,所以需要確保應(yīng)用的代碼不要與這些內(nèi)置的提供詳情的路徑解析相沖突礁竞。
@RequestMapping("/configprops/test") //這是十分錯誤的糖荒,與http get/configprops查看配置屬性路徑?jīng)_突
public String testApplicationProperties(){
? ? ? ? ? ? ? ?return applicationProper.mapperidentity;
}
可看到,采用了spring-boot-start-actuator之后模捂,直接以REST的方式捶朵,獲取進(jìn)程的運(yùn)行期性能參數(shù)。所以要避免在RequestMapping中路徑?jīng)_突.
加入actuator依賴后狂男,應(yīng)用啟動后會創(chuàng)建一些基于Web的Endpoint:
/autoconfig综看,用來查看Spring Boot的框架自動配置信息,哪些被自動配置岖食,哪些沒有红碑,原因是什么。
/beans泡垃,顯示應(yīng)用上下文的Bean列表
/dump析珊,顯示線程dump信息
/health,應(yīng)用健康狀況檢查
/metrics
/shutdown,默認(rèn)沒有打開
/trace
數(shù)據(jù)訪問
在傳統(tǒng)的Spring應(yīng)用中蔑穴,訪問數(shù)據(jù)庫我們需要配置:
類路徑上添加數(shù)據(jù)庫訪問驅(qū)動
實(shí)例化DataSource對象忠寻,指定數(shù)據(jù)庫url,username,password等信息
注入JdbcTemplate對象,如果使用Hibernate存和,Mybatis等框架奕剃,還需要進(jìn)一步配置框架信息
在Spring?Boot中,上述過程會被簡化捐腿。首先在Maven項(xiàng)目依賴中定義:
spring-boot-starter-jdbc引入了spring-jdbc依賴祭饭,h2是一個(gè)內(nèi)存關(guān)系型數(shù)據(jù)庫。在引入了這些依賴并啟動Spring Boot應(yīng)用程序后叙量,autoconfigure發(fā)現(xiàn)spring-jdbc位于類路徑中倡蝙,于是根據(jù)類路徑上的JDBC驅(qū)動類型(這里是h2,預(yù)定義了derby,sqlite, mysql, oracle, sqlserver等等)绞佩,創(chuàng)建一個(gè)DataSource連接池對象寺鸥,本例中的h2是內(nèi)存數(shù)據(jù)庫,無需任何配置品山,如果是mysql, oracle等類型的數(shù)據(jù)庫需要開發(fā)者配置相關(guān)信息胆建。
在SpringContext中創(chuàng)建一個(gè)JdbcTemplate對象(使用DataSource初始化)接下來開發(fā)者的工作就非常簡單了,在業(yè)務(wù)邏輯中直接引入JdbcTemplate即可:
除了spring-jdbc肘交,Spring Boot還能夠支持JPA笆载,以及各種NoSQL數(shù)據(jù)庫——包括MongoDB。
spring-boot-starter-data-jpa包含進(jìn)來,Boot的自動配置引擎就能探測到你的工程需要數(shù)據(jù)訪問功能,凉驻,并且會在Spring應(yīng)用上下文中創(chuàng)建必要的Bean腻要,這樣你就可以使用Repository和服務(wù)了。
CrudRepository提供了一些通用的接口方法來創(chuàng)建涝登、查詢雄家、更新以及刪除對象和對象集合。應(yīng)用所需的其他特定功能可以按照Spring Data的Repository開發(fā)約定進(jìn)行定義胀滚。一旦UserRepository接口創(chuàng)建成功趟济,Boot的spring-data-jpa層會在工程中探測到它,并將其添加到Spring應(yīng)用上下文之中咽笼,這樣對于controller和sevice對象來說顷编,它就成為可以進(jìn)行自動注入的可選對象。這種自動化的配置只有在Boot應(yīng)用要求按照這種方式初始化的時(shí)候才生效剑刑,這是通過存在@EnableAutoConfiguration注解來標(biāo)識的媳纬。
微服務(wù)所提供的數(shù)據(jù)并不一定全部適合關(guān)系型結(jié)構(gòu),針對這一點(diǎn)Spring Boot也暴露了一些模塊叛甫,從而讓開發(fā)人員可以使用Spring Data的MongoDB和Redis項(xiàng)目层宫,不過依然采取特定的方式來進(jìn)行配置。Spring Data用來定義數(shù)據(jù)訪問對象(Data Access Object)的高層框架其监,這樣快速切換JPA與非JPA數(shù)據(jù)源會變得非常容易萌腿。
public interface UserRepository extendsMongoRepository {
}
MongoRepository接口也擴(kuò)展了CrudRepository,因此微服務(wù)的Controller代碼抖苦,也就是程序清單1.8所示并不需要修改毁菱。為了實(shí)現(xiàn)與MongoDB的集成,工程唯一要做的就是在應(yīng)用的classpath中包含spring-boot-starter-data-mongodb
配置
默認(rèn)情況下Spring Boot加載類路徑上的application.properties或application.yml文件锌历,我們也可以很快地重寫Spring Boot的默認(rèn)配置贮庞。默認(rèn)情況下,應(yīng)用的配置可以使用Java屬性文件來進(jìn)行定義究西,這個(gè)文件名為application.properties并且位于應(yīng)用的classpath根目錄下窗慎。不過,一種更好的方式是使用YAML配置卤材,它提供了結(jié)構(gòu)化以及嵌套的配置遮斥。在應(yīng)用的運(yùn)行時(shí)類路徑之中包含snakeyaml之后,你的工程就可以在application.yml文件中直接定義配置了扇丛。但我個(gè)人仍然喜歡用application.properties.
spring.datasource.url=jdbc:mysql://localhost/test
spring.datasource.username=dbuser
spring.datasource.password=dbpass
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
微服務(wù)必須要支持的很重要的一點(diǎn)就是外部化配置术吗。這種配置可以包含任何的內(nèi)容. Boot一個(gè)很棒的特性在于它能管理外部化的配置并將其轉(zhuǎn)換為對象結(jié)構(gòu),這個(gè)對象可以在整個(gè)應(yīng)用上下文中使用帆精。創(chuàng)建一個(gè)簡單老式的Java/Groovy對象(Plain Old Java/Groovy Object)较屿,并使用@ConfigurationProperties注解隧魄,那么這個(gè)對象就能使用Boot配置結(jié)構(gòu)中預(yù)先定義的name名下的配置項(xiàng)。
@PropertySource(value ="application.properties")
@Configuration
public class ApplicationProperties {
? ? ? ?@Value("${test}")
? ? ? ? public String test;
? ? ? ? ?publicString getTest() {
? ? ? ? ? ? ? returntest;
? ? ? ? ? }
? ? ? ? ?public void setTest(String test) {
? ? ? ? ? ? ? ? ?this.test= test;
? ? ? ? ? }
}
當(dāng)ApplicationProperties對象在Spring上下文中創(chuàng)建完成之后隘蝎,Boot將會識別出它是一個(gè)配置對象购啄,并且會按照運(yùn)行時(shí)classpath之中application.properties或application.yml文件中的配置指令填充它的屬性。因此末贾,如果我們在微服務(wù)的application.yml文件中添加application內(nèi)容區(qū)的話闸溃,如程序清單1.16所示整吆,那么我們就可以在應(yīng)用的其他部分以編程的方式訪問這些配置指令
public class MainApplication {
? ? ? @Autowired
? ? ? ?private ApplicationPropertiesapplicationProper;
? ? ? ?publicstatic void main(String[] args) {
? ? ? ? ? ? ?SpringApplication.run(MainApplication.class,args);
? ? ? ?}
? ? ? ?@RequestMapping("/testApplicationProperties")
? ? ? ? publicString testApplicationProperties(){
? ? ? ? ? ? return applicationProper.test;
? ? ? ?}
}
配置類也支持嵌套式的對象圖拱撵,這樣來自于配置中的深層數(shù)據(jù)就能更便利地進(jìn)行訪問,也有了更好的語義表蝙。例如拴测,如果我們想要得到的配置指令是application.根下的那些metrics key,那么可以在ApplicationPropertiesPOGO中添加一個(gè)嵌套對象來表示府蛇。注解必須先使用@Configuration集索,將此類聲明為配置類型。且必須有set,get方法汇跨,遵循傳統(tǒng)pojo屬性查找模式
安全
在微服務(wù)的開發(fā)中务荆,對于完備安全場景的需求會持續(xù)增長。為了滿足這種需求穷遂,Boot引入了強(qiáng)大完整的Spring Security函匕,并且提供了自動配置的功能,以快速簡便地啟用安全層蚪黑。只需在應(yīng)用的classpath中包含spring-boot-starter-security模塊就能使Boot引入一些安全特性盅惜,如跨站腳本防護(hù)(cross-site scripting
protection)并且會添加頭信息以防止點(diǎn)擊劫持(click-jacking)。除此之外忌穿,添加一條簡單的配置指令就能啟用基本認(rèn)證來保護(hù)你的應(yīng)用
使用略
消息集成
Boot并沒有提供明確的Spring上下文自動化配置抒寂,但是它為Spring Integration提供了一個(gè)starter模塊,它會負(fù)責(zé)引入Spring Integration項(xiàng)目的一系列依賴掠剑。這些依賴包括Spring
Integration的核心庫(Core library)屈芜、HTTP模塊(用來進(jìn)行面向HTTP的企業(yè)集成)、IP模塊(用來進(jìn)行基于Socket的集成操作)朴译、File模塊(用于進(jìn)行文件系統(tǒng)集成)以及Stream模塊(用于支持使用Stream的操作井佑,如stdin和stdout)。這個(gè)starter模塊為開發(fā)人員提供了健壯的消息功能的工具集动分,可以使已有的基礎(chǔ)設(shè)施適應(yīng)微服務(wù)APIs
使用略
提供度量指標(biāo)
使用略
@EnableAutoCongiguration
從Spring 3.0開始毅糟,為了替代繁瑣的XML配置,引入了@Enable...注解對@Configuration類進(jìn)行修飾以達(dá)到和XML配置相同的效果澜公。想必不少開發(fā)者已經(jīng)使用過類似注解:
@EnableTransactionManagement開啟Spring事務(wù)管理姆另,相當(dāng)于XMl中的
@EnableWebMvc使用Spring MVC框架的一些默認(rèn)配置
@EnableScheduling會初始化一個(gè)Scheduler用于執(zhí)行定時(shí)任務(wù)和異步任務(wù)
Spring Boot提供的@EnableAutoCongiguration似乎功能更加強(qiáng)大喇肋,一旦加上,上述所有的配置似乎都被包含進(jìn)來而無需開發(fā)者顯式聲明迹辐。
它究竟是如何做到的呢蝶防,先看看它的定義:
為了添加生產(chǎn)環(huán)境特性支持,需要在Maven依賴中引入:
加入actuator依賴后明吩,應(yīng)用啟動后會創(chuàng)建一些基于Web的Endpoint:
/autoconfig间学,用來查看Spring Boot的框架自動配置信息,哪些被自動配置印荔,哪些沒有低葫,原因是什么。
/beans仍律,顯示應(yīng)用上下文的Bean列表
/dump嘿悬,顯示線程dump信息
/health,應(yīng)用健康狀況檢查
/metrics
/shutdown,默認(rèn)沒有打開
/trace
下一節(jié)將進(jìn)入Spring Boot正式學(xué)習(xí)講解階段.如果您覺得這篇文章對您有幫助水泉,就請贊賞支持善涨。