Spring Boot提供了一種新的編程范式侠驯,能在最小的阻力下開(kāi)發(fā)Spring應(yīng)用程序,可以更加敏捷地開(kāi)發(fā)Spring應(yīng)用程序,專(zhuān)注于應(yīng)用程序的功能奕巍,不用在Spring的配置上多花功夫陵霉,甚至完全不用配置。
Springboot最重要的是以下四個(gè)核心:
自動(dòng)配置:針對(duì)很多Spring應(yīng)用程序常見(jiàn)的應(yīng)用功能伍绳,Spring Boot能自動(dòng)提供相關(guān)配置踊挠。
起步依賴(lài):告訴Spring Boot需要什么功能,它就能引入需要的庫(kù)。起步依賴(lài)其實(shí)就是特殊的Maven依賴(lài)和Gradle依賴(lài)效床,利用了傳遞依賴(lài)解析睹酌,把常用庫(kù)聚合在一起,組成了幾個(gè)為特定功能而定制的依賴(lài)剩檀。
命令行界面:這是Spring Boot的可選特性憋沿,借此你只需寫(xiě)代碼就能完成完整的應(yīng)用程序,無(wú)需傳統(tǒng)項(xiàng)目構(gòu)建沪猴。
Actuator:讓你能夠深入運(yùn)行中的Spring Boot應(yīng)用程序辐啄。Actuator提供在運(yùn)行時(shí)檢視應(yīng)用程序內(nèi)部情況的能力。安裝了Actuator就能窺探應(yīng)用程序的內(nèi)部情況运嗜,包括如下細(xì)節(jié):
Spring應(yīng)用程序上下文里配置的Bean
Spring Boot的自動(dòng)配置做的決策
應(yīng)用程序取到的環(huán)境變量壶辜、系統(tǒng)屬性、配置屬性和命令行參數(shù)
應(yīng)用程序里線程的當(dāng)前狀態(tài)
應(yīng)用程序最近處理過(guò)的HTTP請(qǐng)求的追蹤情況
各種和內(nèi)存用量担租、垃圾回收砸民、Web請(qǐng)求以及數(shù)據(jù)源用量相關(guān)的指標(biāo)
創(chuàng)建Spring Boot 項(xiàng)目
1、使用 Spring Initializr 創(chuàng)建 Springboot 項(xiàng)目奋救。
Spring Initializr有幾種用法:
通過(guò)Web界面使用岭参。
通過(guò)Spring Tool Suite使用。
通過(guò)IntelliJ IDEA使用尝艘。
使用Spring Boot CLI使用
本人常用的通過(guò)官網(wǎng)web界面創(chuàng)建和IDEA創(chuàng)建演侯,這里介紹這種方式。
(1)背亥、通過(guò)官網(wǎng)web界面創(chuàng)建
(a)秒际、瀏覽器打開(kāi)start.spring.io,如下圖:
左側(cè)根據(jù)你需要選擇項(xiàng)目類(lèi)型隘梨、編程語(yǔ)言程癌、Springboot版本、打包方式轴猎、Java版本嵌莉,輸入項(xiàng)目信息,右側(cè)還可以選擇需要的依賴(lài)捻脖,下面有三個(gè)按鈕GENERATE锐峭、EXPLORE、SHARE可婶。點(diǎn)擊GENERAE直接下載沿癞,點(diǎn)擊EXPLORE彈出一個(gè)頁(yè)面可以展示生成的代碼,再點(diǎn)擊download進(jìn)行下載矛渴。SHARE可以復(fù)制創(chuàng)建springboot的路徑椎扬。
(b)惫搏、將下載的壓縮包解壓到計(jì)算機(jī)中,這就是Springboot最基本的項(xiàng)目架構(gòu)了蚕涤。
(2)筐赔、IDEA創(chuàng)建Springboot項(xiàng)目
(a)、打開(kāi)IDEA揖铜,依次點(diǎn)擊File-->New-->project茴丰,出現(xiàn)如下界面:
紅色方框里的地址是不是和上一種方式的地址一樣?其實(shí)IDEA創(chuàng)建本質(zhì)上也和上一樣的天吓,都是從這個(gè)網(wǎng)址創(chuàng)建贿肩,不過(guò)IDEA自動(dòng)幫我們做了。
(b)龄寞、點(diǎn)擊Next出現(xiàn)如下界面汰规,也和上一種方式類(lèi)似,輸入項(xiàng)目信息萄焦,選擇項(xiàng)目類(lèi)型控轿,Java版本冤竹,打包方式等拂封。
(c)、繼續(xù)點(diǎn)擊Next出現(xiàn)如下界面鹦蠕,是不是也很熟悉冒签,這里選擇依賴(lài)、springboot版本钟病。
(d)萧恕、繼續(xù)點(diǎn)擊Next出現(xiàn)如界面,輸入項(xiàng)目名稱(chēng)肠阱,選擇項(xiàng)目路徑票唆,點(diǎn)擊Finish完成創(chuàng)建。
這兩種方式是使用Spring Initializr 創(chuàng)建Springboot項(xiàng)目屹徘,Springboot也是一種Maven項(xiàng)目走趋,還有一種就是創(chuàng)建Maven項(xiàng)目的方式進(jìn)行創(chuàng)建。
2噪伊、Maven創(chuàng)建Springboot項(xiàng)目
先創(chuàng)建Maven項(xiàng)目再將Springboot特有的依賴(lài)加入到pom中
在包根目錄下創(chuàng)建一個(gè)帶@SpringBootApplication注解的main方法類(lèi)簿煌。
自動(dòng)配置
@SpringBootApplication注解的類(lèi)在Spring Boot應(yīng)用程序里有兩個(gè)作用:配置和啟動(dòng)引導(dǎo)。@SpringBootApplication 開(kāi)啟了Spring的組件掃描和Spring Boot的自動(dòng)配置功能鉴吹。實(shí)際上姨伟, @SpringBootApplication 將三個(gè)有用的注解組合在了一起:
Spring的 @Configuration :標(biāo)明該類(lèi)使用Spring基于Java的配置。
Spring的 @ComponentScan :?jiǎn)⒂媒M件掃描豆励,這樣你寫(xiě)的Web控制器類(lèi)和其他組件才能被自動(dòng)發(fā)現(xiàn)并注冊(cè)為Spring應(yīng)用程序上下文里的Bean夺荒。
Spring Boot 的 @EnableAutoConfiguration : 這 個(gè) 不 起 眼 的 小 注 解 也 可 以 稱(chēng) 為@Abracadabra,就是這一行配置開(kāi)啟了Spring Boot自動(dòng)配置的魔力,讓你不用再寫(xiě)成篇的配置了技扼。
Spring 4.0引入條件化配置在孝,條件化配置允許配置存在于應(yīng)用程序中,但在滿足某些特定條件之前都忽略這個(gè)配置淮摔。Spring Boot運(yùn)用條件化配置的方法是私沮,定義多個(gè)特殊的條件化注解,并將它們用到配置類(lèi)上和橙。這些條件化配置類(lèi)構(gòu)成了Springboot的自動(dòng)配置仔燕。
自動(dòng)配置中使用的條件化注解:
@ConditionalOnBean ? ? 配置了某個(gè)特定Bean
@ConditionalOnMissingBean ? ? 沒(méi)有配置特定的Bean
@ConditionalOnClass ? ? ? ?Classpath里有指定的類(lèi)
@ConditionalOnMissingClass ? ? ?Classpath里缺少指定的類(lèi)
@ConditionalOnExpression ? ? ?給定的Spring Expression Language(SpEL)表達(dá)式計(jì)算結(jié)果為 true
@ConditionalOnJava ? ? ? ? Java的版本匹配特定值或者一個(gè)范圍值
@ConditionalOnJndi ? ? ? ?參數(shù)中給定的JNDI位置必須存在一個(gè),如果沒(méi)有給參數(shù)魔招,則要有JNDI ?InitialContext
@ConditionalOnProperty ? ? ? 指定的配置屬性要有一個(gè)明確的值
@ConditionalOnResource ? ? ?Classpath里有指定的資源
@ConditionalOnWebApplication ? ? ? 這是一個(gè)Web應(yīng)用程序
@ConditionalOnNotWebApplication ? ?這不是一個(gè)Web應(yīng)用程序
自定義配置
springboot可以使用兩種影響自動(dòng)配置的方式晰搀,使用顯式配置進(jìn)行覆蓋和使用屬性進(jìn)行精細(xì)化配置。
覆蓋 Spring Boot 自動(dòng)配置
大多數(shù)情況下办斑,自動(dòng)配置的Bean剛好能滿足你的需要外恕,不需要去覆蓋它們。但某些情況下乡翅,Spring Boot在自動(dòng)配置時(shí)還不能很好地進(jìn)行推斷鳞疲。我們可以在了解自動(dòng)配置提供了什么之后,我們?cè)賮?lái)覆蓋基礎(chǔ)的安全配置蠕蚜,以滿足特定的場(chǎng)景需求尚洽。
1、創(chuàng)建自定義的配置
覆蓋自動(dòng)配置很簡(jiǎn)單靶累,就當(dāng)自動(dòng)配置不存在腺毫,直接顯式地寫(xiě)一段配置。這段顯式配置的形式不限挣柬,Spring支持的XML和Groovy形式配置都可以潮酒。Spring Boot會(huì)發(fā)現(xiàn)你的配置,隨后降低自動(dòng)配置的優(yōu)先級(jí)邪蛔,以你的配置為準(zhǔn)急黎。
2、通過(guò)屬性文件外置配置
Spring Boot應(yīng)用程序有多種設(shè)置途徑店溢。Spring Boot能從多種屬性源獲得屬性叁熔,包括
如下幾處。
(1) 命令行參數(shù)
(2) ?java:comp/env 里的JNDI屬性
(3) JVM系統(tǒng)屬性
(4) 操作系統(tǒng)環(huán)境變量
(5) 隨機(jī)生成的帶 random.* 前綴的屬性(在設(shè)置其他屬性時(shí)床牧,可以引用它們荣回,比如 ${random.long} )
(6) 應(yīng)用程序以外的application.properties或者appliaction.yml文件
(7) 打包在應(yīng)用程序內(nèi)的application.properties或者appliaction.yml文件
(8) 通過(guò) @PropertySource 標(biāo)注的屬性源
(9) 默認(rèn)屬性
這個(gè)列表按照優(yōu)先級(jí)排序,也就是說(shuō)戈咳,任何在高優(yōu)先級(jí)屬性源里設(shè)置的屬性都會(huì)覆蓋低優(yōu)先級(jí)的相同屬性
application.properties和application.yml文件能放在以下四個(gè)位置心软。
(1) 外置壕吹,在相對(duì)于應(yīng)用程序運(yùn)行目錄的/config子目錄里。
(2) 外置删铃,在應(yīng)用程序運(yùn)行的目錄里耳贬。
(3) 內(nèi)置,在config包內(nèi)猎唁。
(4) 內(nèi)置咒劲,在Classpath根目錄。
這個(gè)列表按照優(yōu)先級(jí)排序诫隅,高優(yōu)先級(jí)位置的配置會(huì)覆蓋低優(yōu)先級(jí)位置的配置腐魂。
自動(dòng)配置微調(diào)
springboot有300多個(gè)屬性可以用來(lái)微調(diào)Spring Boot應(yīng)用程序里的Bean。下面列舉幾個(gè)例子:
1逐纬、禁用模板緩存
spring.thymeleaf.cache(thymeleaf模板)
spring.freemarker.cache (Freemarker)
spring.groovy.template.cache (Groovy模板)
spring.velocity.cache (Velocity)
默認(rèn)情況下蛔屹,這些屬性都為 true ,也就是開(kāi)啟緩存豁生。將它們?cè)O(shè)置為 false 即可禁用緩存兔毒。
2、配置嵌入式服務(wù)器
springboot內(nèi)置服務(wù)器(Tomcat)甸箱,運(yùn)行Spring Boot應(yīng)用程序時(shí)育叁,應(yīng)用程序會(huì)啟動(dòng)一個(gè)嵌入式的服務(wù)器(默認(rèn)是Tomcat),監(jiān)聽(tīng)8080端口摇肌。
server.port(配置端口)
server.ssl.key-store(密鑰存儲(chǔ)文件的存放路徑)
server.ssl.key-store-password和server.ssl.key-password(創(chuàng)建秘鑰文件時(shí)給定的密碼)
3擂红、4配置日志
默認(rèn)情況下仪际,Spring Boot會(huì)用Logback來(lái)記錄日志围小,并用 INFO 級(jí)別輸出到控制臺(tái)。如果決定使用Log4j或者Log4j2树碱,那么你只需要修改依賴(lài)肯适,引入對(duì)應(yīng)該日志實(shí)現(xiàn)的起步依賴(lài),同時(shí)排除掉Logback成榜。在配置文件可以配置日志等級(jí)框舔、路徑等信息。
4赎婚、配置數(shù)據(jù)源
通過(guò)屬性配置數(shù)據(jù)庫(kù)的URL和身份信息就可以了刘绣。
5、使用 Profile 進(jìn)行配置
當(dāng)應(yīng)用程序需要部署到不同的運(yùn)行環(huán)境時(shí)挣输,可以使用基于Profile的配置纬凤。Profile是一種條件化配置,基于運(yùn)行時(shí)激活的Profile撩嚼,會(huì)使用或者忽略不同的Bean或配置類(lèi)停士。設(shè)置 spring.profiles.active 屬性就能激活Profile挖帘,任意設(shè)置配置屬性的方式都能用于設(shè)置這個(gè)值。
spring.profiles.active=production
為每個(gè)環(huán)境分別創(chuàng)建配置恋技,使用特定于Profile的屬性文件,如application-{profile}.properties拇舀,application-{profile}.yml。
6蜻底、定制應(yīng)用程序錯(cuò)誤頁(yè)面
Spring Boot自動(dòng)配置的默認(rèn)錯(cuò)誤處理器會(huì)查找名為error的視圖骄崩,如果找不到就用默認(rèn)的白標(biāo)錯(cuò)誤視圖
最簡(jiǎn)單的方法就是創(chuàng)建一個(gè)自定義視圖,讓解析出的視圖名為error薄辅。這一點(diǎn)歸根到底取決于錯(cuò)誤視圖解析時(shí)的視圖解析器刁赖。
實(shí)現(xiàn)了Spring的View接口的Bean,其ID為error(由Spring的 BeanNameViewResolver所解析)长搀。
如果配置了Thymeleaf宇弛,則有名為error.html的Thymeleaf模板。
如果配置了FreeMarker源请,則有名為error.ftl的FreeMarker模板枪芒。
如果配置了Velocity,則有名為error.vm的Velocity模板谁尸。
如果是用JSP視圖舅踪,則有名為error.jsp的JSP模板。
錯(cuò)誤頁(yè)有兩處特別的信息需要呈現(xiàn):錯(cuò)誤的請(qǐng)求路徑和異常消息良蛮。默認(rèn)情況下抽碌,Spring Boot會(huì)為錯(cuò)誤視圖提供如下錯(cuò)誤屬性。
timestamp :錯(cuò)誤發(fā)生的時(shí)間决瞳。
status :HTTP狀態(tài)碼货徙。
error :錯(cuò)誤原因。
exception :異常的類(lèi)名皮胡。
message :異常消息(如果這個(gè)錯(cuò)誤是由異常引起的)痴颊。
errors : BindingResult 異常里的各種錯(cuò)誤(如果這個(gè)錯(cuò)誤是由異常引起的)。
trace :異常跟蹤信息(如果這個(gè)錯(cuò)誤是由異常引起的)屡贺。
path :錯(cuò)誤發(fā)生時(shí)請(qǐng)求的URL路徑蠢棱。