SpringBoot - SpringBoot配置文件

SpringBoot最大的的優(yōu)勢就是簡化了SpringMVC中很多繁瑣的配置工作,采用了自動配置以及利用注解的方式代替原來的XML配置的方式來配置工程。

一.Bean的配置

配置JAVA注解 :@Configuration
Bean添加到容器的注解:@Bean

package com.springboot.config;

import com.springboot.service.HelloService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;


/**
 * @author BaoZhou
 * @date 2018/5/4
 */
@Configuration
public class MyAppConfig {
    //講方法的返回值添加到容器中
    @Bean
    public HelloService helloservice() {
        System.out.println("配置類@bean給容器中添加組件");
        return new HelloService();
    }
}

二.多Profile配置

1.properties方式

我們在主配置文件編寫的時候,文件名可以是application-{profile}.properites/yml,模式使用application.properties;選擇某個profile時,只需要用如下代碼:

spring.profiles.active=profile //此處為你定義的profile

2.YML方式

可以利用YML的文件塊特性


server:
  port: 8081
spring:
  active: dev  //此處激活
---
server:
  port: 8083
spring:
  profiles: dev  
---
server:
  port: 8084
spring:
  profiles: prod

利用橫線(---)進行文件塊的劃分,再需要激活的配置文件部分寫上active,其他用profiles:命名即可

3.命令行

命令行方式

或者在打出JAR包后利用指令--spring.profile.active=dev運行JAR包

4.虛擬機參數(shù)

虛擬機參數(shù)

-Dspring.profiles.active=dev;

三.配置文件的加載路徑

springboot會從以下路徑去搜索配置文件,配置文件名字默認為application.properties/yml

路徑由高到低:

file ../config
file ../
classpath:/confi/g
classpath:/

其中有相同屬性時,優(yōu)先級會覆蓋低優(yōu)先級。有不同屬性時,配置文件之間會形成互補。

四.可配置的屬性

參考SpringBoot官方文檔

五.自動配置原理

通過注釋@SpringBootApplication加載主配置類

方法繼承關(guān)系:
SpringBootApplication注釋
--> EnableAutoConfiguration注釋
--> AutoConfigurationImportSelector.class類
--> getCandidateConfigurations方法
--> SpringFactoriesLoader方法
--> 從META-INF/spring.factories里讀取配置參數(shù)鍵值對

讀取配置參數(shù)代碼如下

@Override
    public String[] selectImports(AnnotationMetadata annotationMetadata) {
        if (!isEnabled(annotationMetadata)) {
            return NO_IMPORTS;
        }
        AutoConfigurationMetadata autoConfigurationMetadata =
        AutoConfigurationMetadataLoader.loadMetadata(this.beanClassLoader);
        AnnotationAttributes attributes = getAttributes(annotationMetadata);
        List<String> configurations =
        getCandidateConfigurations(annotationMetadata,attributes);
        configurations = removeDuplicates(configurations);
        Set<String> exclusions = getExclusions(annotationMetadata, attributes);
        checkExcludedClasses(configurations, exclusions);
        configurations.removeAll(exclusions);
        configurations = filter(configurations, autoConfigurationMetadata);
        fireAutoConfigurationImportEvents(configurations, exclusions);
        return StringUtils.toStringArray(configurations);
    }
    

首先讀取JAR包中META-INF/spring.factories路徑中的所有屬性,然后篩選出EnableAutoConfiguration下的組件加入到容器中,里面的每一個自動配置類來完成自動配置功能。

# 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.CassandraReactiveDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.cassandra.CassandraReactiveRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.cassandra.CassandraRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.couchbase.CouchbaseDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.couchbase.CouchbaseReactiveDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.couchbase.CouchbaseReactiveRepositoriesAutoConfiguration,\
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.MongoReactiveDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.mongo.MongoReactiveRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration,\

那么自動配置的組件是如何完成自動配置的呢,我們以HttpEncodingAutoConfiguration為例,上面的幾個conditional都是用來判斷配置是否生效。

@Configuration  //表示這是一個配置類
@EnableConfigurationProperties(HttpEncodingProperties.class)//啟用configurationProperties功能,把HttpEncodingProperties加入到IOC容器中
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)//條件判斷,滿足條件配置類才能生效,判斷當前應(yīng)用是否為WEB引用
@ConditionalOnClass(CharacterEncodingFilter.class)//條件判斷,判斷當前項目是否有CharacterEncodingFilter.class類
@ConditionalOnProperty(prefix = "spring.http.encoding", value = "enabled", matchIfMissing = true)//條件判斷,判斷配置文件是否存再spring.http.encoding,假如沒有也返回為true
public class HttpEncodingAutoConfiguration {

EnableConfigurationProperties為配置屬性,我們所能夠配置的屬性都在這個類中。讀取配置文件取指定的值后再與Bean進行綁定。

@ConfigurationProperties(prefix = "spring.http.encoding")
public class HttpEncodingProperties {
    private final HttpEncodingProperties properties;
    //當只有一個有參構(gòu)造時,他會從IOC容器中讀取
    public HttpEncodingAutoConfiguration(HttpEncodingProperties properties) {
        this.properties = properties;
    }
    @Bean
    @ConditionalOnMissingBean
    public CharacterEncodingFilter characterEncodingFilter() {
        CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter();
        filter.setEncoding(this.properties.getCharset().name());
        filter.setForceRequestEncoding(this.properties.shouldForce(Type.REQUEST));
        filter.setForceResponseEncoding(this.properties.shouldForce(Type.RESPONSE));
        return filter;
    }

自動配置原理小結(jié)

  1. SpringBoot啟動時會加載大量的自動配置類。
  2. 我們看我們需要的功能是否有默認的自動配置。
  3. 查看自動配置類中配置了哪些組件。
  4. 給容器中自動配置類添加組件的時候,會從properties類中獲取某些屬性,我們就可以在配置文件中設(shè)定這些屬性的值。
    xxxxAutoConfiguration:自動配置類
    xxxxPropertios:封裝配置文件中相關(guān)屬性

六.有關(guān)于條件篩選@Conditional注釋

SpringBoot再@Conditional又擴展出了多個注解以方面使用:

注解 作用 例子
@ConditionalOnJava 系統(tǒng)JAVA版本是否符合要求 ConditionalOnJava(JavaVersion.EIGHT)
@ConditionalOnBean
@ConditionalOnMissingBean
容器中(不)存在指定BEAN @ConditionalOnBean(javax.sql.DataSource.class)
@ConditionalOnExpression 滿足SqEL表達式指定 @ConditionalOnExpression("'${server.host}'=='localhost'")
@ConditionaOnClass
@ConditionalOnMissingClass
容器中(不)存在指定Class @ConditionalOnClass({ test.class,test2.class })
@ConditionalOnSingleCandidate 容器中只有一個指定的Bean或者這個Bean是首選Bean @ConditionalOnSingleCandidate(test.class)
@ConditionalOnProperty 系統(tǒng)中指定的屬性是否有指定的值 @ConditionalOnProperty(prefix = "spring.aop", name = "auto",matchIfMissing = true)
@ConditionalOnResource 類路徑下是否有指定的資源文件 @ConditionalOnResource(resources="mybatis.xml")
@ConditionalOnWebApplication
@ConditionalOnNotWebApplication
當前(不)是WEB環(huán)境 無參數(shù)
@ConditionalOnjndi JNDI存在指定項 --

你可以在配置文件中添加

debug=true

在日志中查看在你的項目中啟用了哪些自動配置類

那么有關(guān)于SpringBoot配置文件的相關(guān)學習筆記小結(jié)就到這里了。覺得不錯的話可以點一個喜歡,謝謝大家!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,119評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,382評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,038評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,853評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,616評論 6 408
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,112評論 1 323
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,192評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,355評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,869評論 1 334
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,727評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,928評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,467評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,165評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,570評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,813評論 1 282
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,585評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,892評論 2 372

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