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) ,丁雪豐 (譯者)》