Spring Boot筆記

4個(gè)核心

  • 自動(dòng)配置(重要)
  • 起步依賴(重要)
  • 命令行界面(沒(méi)用過(guò))
  • Actuator(可選莱找,帶來(lái)很多有用的監(jiān)控功能)
自動(dòng)配置

針對(duì)很多Spring應(yīng)用程序常見(jiàn)的應(yīng)用功能,Spring Boot提供相關(guān)默認(rèn)的配置踊跟。 在傳統(tǒng)的spring開(kāi)發(fā)中覆醇,無(wú)論是spring自身或者是與第三方框架(spring mvc捆姜、mybatis妆够、Redis缩焦、RocketMQ...)整合時(shí),需要配置大量的配置责静,而使用Spring Boot可以做到零配置,當(dāng)然用戶可以自定義配置來(lái)覆蓋Spring Boot的默認(rèn)配置盖桥。這極大的簡(jiǎn)化了開(kāi)發(fā)灾螃。實(shí)現(xiàn)的原理在上一篇中有提到,這里總結(jié)一下自動(dòng)配置的原理:@EnableAutoConfiguration注解開(kāi)啟自動(dòng)配置功能揩徊,該注解Import了EnableAutoConfigurationImportSelector腰鬼,EnableAutoConfigurationImportSelector使用SpringFactoriesLoader.loadFactoryNames方法來(lái)掃描具有MEAT-INF/spring.factories文件。下面是spring-boot-autoconfigure-1.5.20.RELEASE.jar包下spring.factories文件的部分配置

# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\
org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration,\
org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration,\
org.springframework.boot.autoconfigure.cloud.CloudAutoConfiguration,\
org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration,\
org.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration,\
org.springframework.boot.autoconfigure.couchbase.CouchbaseAutoConfiguration,\
org.springframework.boot.autoconfigure.dao.PersistenceExceptionTranslationAutoConfiguration,\
org.springframework.boot.autoconfigure.data.cassandra.CassandraDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.cassandra.CassandraRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.couchbase.CouchbaseDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.couchbase.CouchbaseRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchAutoConfiguration,\
org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.ldap.LdapDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.ldap.LdapRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.neo4j.Neo4jDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.neo4j.Neo4jRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.solr.SolrRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration,\
org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.rest.RepositoryRestMvcAutoConfiguration,\
org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration,\
org.springframework.boot.autoconfigure.elasticsearch.jest.JestAutoConfiguration,\
org.springframework.boot.autoconfigure.freemarker.FreeMarkerAutoConfiguration

SpringBoot啟動(dòng)時(shí)會(huì)掃描spring.factorie中的類塑荒,如上面的*AutoConfiguration類熄赡,而這些*AutoConfiguration類中關(guān)鍵的注解是@Conditional,只要當(dāng)前應(yīng)用程序滿足@Conditional注解的條件齿税,就會(huì)啟動(dòng)響應(yīng)的功能彼硫,并且使用默認(rèn)配置。

起步依賴

在傳統(tǒng)的Spring開(kāi)發(fā)時(shí),要引入SpringMvc需要引入很多個(gè)jar包拧篮,特別麻煩词渤。起步依賴其實(shí)就是特殊的Maven依 賴和Gradle依賴,利用了傳遞依賴解析串绩,把常用庫(kù)聚合在一起缺虐,組成了幾個(gè)為特定功能而定制 的依賴。例如用Spring Boot的起步依賴引入Spring Mvc礁凡,只需添加Spring Boot的Web起步依賴 (org.springframework.boot:spring-boot-starter-web)高氮,僅此一個(gè)。它會(huì)根據(jù)依賴 傳遞把其他所需依賴引入項(xiàng)目里顷牌,你都不用考慮它們剪芍。起步依賴可以理解成基于功能的依賴,只要告訴Spring Boot你要使用什么功能韧掩,Spring Boot就可以將相關(guān)的依賴加載進(jìn)來(lái)紊浩。

Actuator

其他幾個(gè)部分旨在簡(jiǎn)化Spring開(kāi)發(fā),而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)

SpringBoot是什么

從本質(zhì)上來(lái)說(shuō)雇卷,Spring Boot就是Spring鬓椭,它做了那些沒(méi)有它你自己也會(huì)去做的Spring Bean配置。從根本上來(lái)說(shuō)关划,Spring Boot的項(xiàng)目只是普通的Spring項(xiàng)目小染,只是它們正好用到了Spring Boot 的起步依賴和自動(dòng)配置而已。

@SpringBootApplication

開(kāi)啟了Spring的組件掃描和Spring Boot的自動(dòng)配置功能贮折。這是個(gè)組合注解裤翩,內(nèi)部包括以下注解

  • Spring的@Configuration:標(biāo)明該類使用Spring基于Java的配置。雖然本書不會(huì)寫太多 配置调榄,但我們會(huì)更傾向于使用基于Java而不是XML的配置踊赠。
  • Spring的@ComponentScan:?jiǎn)⒂媒M件掃描,這樣你寫的Web控制器類和其他組件才能被 自動(dòng)發(fā)現(xiàn)并注冊(cè)為Spring應(yīng)用程序上下文里的Bean每庆。本章稍后會(huì)寫一個(gè)簡(jiǎn)單的Spring MVC 控制器筐带,使用@Controller進(jìn)行注解,這樣組件掃描才能找到它缤灵。
  • Spring Boot的- --@EnableAutoConfiguration:這個(gè)不起眼的小注解也可以稱為 @Abracadabra①伦籍,就是這一行配置開(kāi)啟了Spring Boot自動(dòng)配置的魔力蓝晒,讓你不用再寫成 篇的配置了

覆蓋起步依賴引入的傳遞依賴

將不需要的依賴exclude排除掉, 可以為你的項(xiàng)目瘦身鸽斟;如果需要用另一個(gè)版本的依賴拔创,則可以直接引進(jìn)其他版本的依賴,Maven總是會(huì)用近的依賴富蓄,也就是說(shuō)剩燥,你在項(xiàng)目的構(gòu)建說(shuō)明文件里增加的這個(gè)依賴,會(huì)覆 蓋傳遞依賴引入的另一個(gè)依賴立倍。不管什么情況灭红,在覆蓋Spring Boot起步依賴引入的傳遞依賴時(shí)都要多加小心。雖然不同的版 本放在一起也許沒(méi)什么問(wèn)題口注,但你要知道变擒,起步依賴中各個(gè)依賴版本之間的兼容性都經(jīng)過(guò)了精心 的測(cè)試

自定義配置

覆蓋Spring Boot自動(dòng)配置

大多數(shù)情況下,自動(dòng)配置的Bean剛好能滿足你的需要寝志,不需要去覆蓋它們娇斑。但某些情況下, Spring Boot在自動(dòng)配置時(shí)還不能很好地進(jìn)行推斷材部。 這里有個(gè)不錯(cuò)的例子:當(dāng)你在應(yīng)用程序里添加安全特性時(shí)毫缆,自動(dòng)配置做得還不夠好。安全配 置并不是放之四海而皆準(zhǔn)的乐导,圍繞應(yīng)用程序安全有很多決策要做苦丁,Spring Boot不能替你做決定。 雖然Spring Boot為安全提供了一些基本的自動(dòng)配置物臂,但是你還是需要自己覆蓋一些配置以滿足特 定的安全要求

創(chuàng)建自定義的配置

覆蓋自動(dòng)配置很簡(jiǎn)單旺拉,就當(dāng)自動(dòng)配置不存在,直接顯式地寫一段配置棵磷。這段顯式配置的形式不限蛾狗,Spring支持的XML和Groovy形式配置都可以。 在編寫顯式配置時(shí)仪媒,我們會(huì)專注于Java形式的配置淘太。再重申一次,想要覆蓋Spring Boot的自動(dòng)配置规丽,你所要做的僅僅是編寫一個(gè)顯式的配置。 Spring Boot會(huì)發(fā)現(xiàn)你的配置撇贺,隨后降低自動(dòng)配置的優(yōu)先級(jí)赌莺,以你的配置為準(zhǔn)。

掀開(kāi)自動(dòng)配置的神秘面紗

正如我們?cè)?.3.3節(jié)里討論的那樣松嘶,Spring Boot自動(dòng)配置自帶了很多配置類艘狭,每一個(gè)都能運(yùn)用 在你的應(yīng)用程序里。它們都使用了Spring 4.0的條件化配置,可以在運(yùn)行時(shí)判斷這個(gè)配置是該被運(yùn) 用巢音,還是該被忽略遵倦。 大部分情況下,表2-1里的@ConditionalOnMissingBean注解是覆蓋自動(dòng)配置的關(guān)鍵官撼。 Spring Boot的DataSourceAutoConfiguration中定義的JdbcTemplate Bean就是一個(gè)非常簡(jiǎn) 單的例子梧躺,演示了@ConditionalOnMissingBean如何工作:

@Bean 
@ConditionalOnMissingBean(JdbcOperations.class) 
public JdbcTemplate jdbcTemplate() {   
  return new JdbcTemplate(this.dataSource);
}

jdbcTemplate()方法上添加了@Bean注解,在需要時(shí)可以配置出一個(gè)JdbcTemplate Bean傲绣。但它上面還加了@ConditionalOnMissingBean注解掠哥,要求當(dāng)前不存在JdbcOperations 類型(JdbcTemplate實(shí)現(xiàn)了該接口)的Bean時(shí)才生效。如果當(dāng)前已經(jīng)有一個(gè)JdbcOperations Bean了秃诵,條件即不滿足续搀,不會(huì)執(zhí)行jdbcTemplate()方法。 什么情況下會(huì)存在一個(gè)JdbcOperations Bean呢菠净?Spring Boot的設(shè)計(jì)是加載應(yīng)用級(jí)配置禁舷,隨 后再考慮自動(dòng)配置類。因此毅往,如果你已經(jīng)配置了一個(gè)JdbcTemplate Bean牵咙,那么在執(zhí)行自動(dòng)配置 時(shí)就已經(jīng)存在一個(gè)JdbcOperations類型的Bean了,于是忽略自動(dòng)配置的JdbcTemplate Bean煞抬。

通過(guò)屬性文件外置配置

實(shí)際上霜大,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í)的相同屬性溪食。例如囊卜,命令行參數(shù)會(huì)覆蓋其他屬性源里的屬性。

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í)排序啊易。也就是說(shuō)吁伺,/config子目錄里的application.properties會(huì)覆蓋 應(yīng)用程序Classpath里的application.properties中的相同屬性。

此外租谈,如果你在同一優(yōu)先級(jí)位置同時(shí)有application.properties和application.yml篮奄,那么application. yml里的屬性會(huì)覆蓋application.properties里的屬性。

自動(dòng)配置微調(diào)

有300多個(gè)屬性可以用來(lái)微調(diào)Spring Boot應(yīng)用程序里的Bean垦垂。附錄C有一個(gè)詳盡的 列表宦搬。

例 如,把它放在應(yīng)用程序Classpath根目錄的application.yml文件里:
server: port: 8000

配置日志
大多數(shù)應(yīng)用程序都提供了某種形式的日志劫拗。即使你的應(yīng)用程序不會(huì)直接記錄日志间校,你所用的 庫(kù)也會(huì)記錄它們的活動(dòng)。 默認(rèn)情況下页慷,Spring Boot會(huì)用Logback(http://logback.qos.ch)來(lái)記錄日志憔足,并用INFO級(jí)別輸 出到控制臺(tái)。
用其他日志實(shí)現(xiàn)替換Logback 酒繁。一般來(lái)說(shuō)滓彰,你不需要切換日志實(shí)現(xiàn);Logback能很好地滿足你的需要州袒。但是揭绑,如果決定使 用Log4j或者Log4j2,那么你只需要修改依賴郎哭,引入對(duì)應(yīng)該日志實(shí)現(xiàn)的起步依賴他匪,同時(shí)排除掉 Logback。

<dependency>   
    <groupId>org.springframework.boot</groupId>   
    <artifactId>spring-boot-starter</artifactId>   
    <exclusions>     
        <exclusion>       
            <groupId>org.springframework.boot</groupId>       
            <artifactId>spring-boot-starter-logging</artifactId>     
        </exclusion>   
    </exclusions>
</dependency> 

<dependency>   
    <groupId>org.springframework.boot</groupId>   
    <artifactId>spring-boot-starter-log4j</artifactId> 
</dependency>

如果你想用Log4j2夸研,可以把spring-boot-starter-log4j改成spring-boot-starter-log4j2邦蜜。 要完全掌握日志配置,可以在Classpath的根目錄(src/main/resources)里創(chuàng)建logback.xml文 件亥至。
即使如此悼沈,你對(duì)日志配置常做的改動(dòng)就是修改日志級(jí)別和指定日志輸出的文件。使用了 Spring Boot的配置屬性后姐扮,你可以在不創(chuàng)建logback.xml文件的情況下修改那些配置絮供。
要設(shè)置日志級(jí)別,你可以創(chuàng)建以logging.level開(kāi)頭的屬性茶敏,后面是要日志名稱杯缺。如果根 日志級(jí)別要設(shè)置為WARN,但Spring Security的日志要用DEBUG級(jí)別睡榆,可以在application.yml里加入 以下內(nèi)容:

logging:   
  path: /var/logs/   
  file: BookWorm.log   
  level:     
    root: WARN     
    org:       
      springframework:         
        security: DEBUG
使用Profile進(jìn)行配置

當(dāng)應(yīng)用程序需要部署到不同的運(yùn)行環(huán)境時(shí)萍肆,一些配置細(xì)節(jié)通常會(huì)有所不同。胀屿。Profile是一種條件化配置塘揣,基于運(yùn)行時(shí)激活的Profile,會(huì) 使用或者忽略不同的Bean或配置類宿崭。

參考《Spring Boot實(shí)戰(zhàn) ,丁雪豐 (譯者)》

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末亲铡,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子葡兑,更是在濱河造成了極大的恐慌奖蔓,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件讹堤,死亡現(xiàn)場(chǎng)離奇詭異吆鹤,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)洲守,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門疑务,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人梗醇,你說(shuō)我怎么就攤上這事知允。” “怎么了叙谨?”我有些...
    開(kāi)封第一講書人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵温鸽,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我手负,道長(zhǎng)涤垫,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任虫溜,我火速辦了婚禮雹姊,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘衡楞。我一直安慰自己吱雏,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布瘾境。 她就那樣靜靜地躺著歧杏,像睡著了一般。 火紅的嫁衣襯著肌膚如雪迷守。 梳的紋絲不亂的頭發(fā)上犬绒,一...
    開(kāi)封第一講書人閱讀 49,784評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音兑凿,去河邊找鬼凯力。 笑死茵瘾,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的咐鹤。 我是一名探鬼主播拗秘,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼祈惶!你這毒婦竟也來(lái)了雕旨?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤捧请,失蹤者是張志新(化名)和其女友劉穎凡涩,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體疹蛉,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡活箕,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了氧吐。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片讹蘑。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖筑舅,靈堂內(nèi)的尸體忽然破棺而出座慰,到底是詐尸還是另有隱情,我是刑警寧澤翠拣,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布版仔,位于F島的核電站,受9級(jí)特大地震影響误墓,放射性物質(zhì)發(fā)生泄漏蛮粮。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一谜慌、第九天 我趴在偏房一處隱蔽的房頂上張望然想。 院中可真熱鬧,春花似錦欣范、人聲如沸变泄。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)妨蛹。三九已至,卻和暖如春晴竞,著一層夾襖步出監(jiān)牢的瞬間蛙卤,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留颤难,地道東北人神年。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像行嗤,于是被迫代替她去往敵國(guó)和親瘤袖。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容