SpringBoot基本配置詳解

SpringBoot項目有一些基本的配置饿敲,比如啟動圖案(banner)莫湘,比如默認配置文件application.properties哄尔,以及相關(guān)的默認配置項振愿。

示例項目代碼在:https://github.com/laolunsi/spring-boot-examples


一毅糟、啟動圖案banner

編寫banner.txt放入resources文件夾下红选,然后啟動項目即可修改默認圖案。

關(guān)于banner的生成姆另,可以去一些專門的網(wǎng)站喇肋。

比如:https://www.bootschool.net/ascii


二、配置文件application

2.1 application.properties/yml

resources下通常會默認生成一個application.properties文件迹辐,這個文件包含了SpringBoot項目的全局配置文件蝶防。里面的配置項通常是這樣的:

server.port=8080

在這個文件里我們可以添加框架支持的配置項,比如項目端口號明吩、JDBC連接的數(shù)據(jù)源间学、日志級別等等。

現(xiàn)在比較流行的是將properties文件改為yml文件印荔。yml文件的格式y(tǒng)aml是這樣的:

server:
    port: 8080

yml和properties的作用是一樣的低葫。而yml的好處是顯而易見的——更易寫易讀。

屬性之間互相調(diào)用使用${name}:

eknown:
    email: eknown@163.com
    uri: http://www.eknown.cn
    title: 'hello, link to ${eknown.uri} or email to ${eknown.email}'

鏈接:SpringBoot所有官方配置屬性


2.2 多環(huán)境配置文件

通常開發(fā)一個應用會有多個環(huán)境仍律,常見如dev/prod嘿悬,也會有test,甚至其他一些自定義的環(huán)境水泉,SpringBoot支持配置文件的靈活切換善涨。

定義新配置文件需要遵循以下格式:application-{profile}.properties 或者application-{profile}.yml

比如現(xiàn)在有dev和prod兩個環(huán)境,我需要在application.yml文件之外新建兩個文件:

  1. application-dev.yml

    server:
       port: 8080
    
  2. application-prod.yml

    server:
      port: 8081
    

然后在application.yml中通過application.profiles.active={profile}指明啟用那個配置:

application:
    profiles:
      active: dev

除了在application.yml中指定配置文件外草则,還可以通過啟動命令指定:java -jar xxx.jar --spring.profiles.active=dev


2.2 自定義配置項并獲取它

主要介紹兩種方式钢拧,獲取單個配置項和獲取多個配置項。

舉例:

eknown:
    email: eknown@163.com
    uri: http://www.eknown.cn

2.2.1 使用@Value注解獲取單個配置項

@Value("${eknown.email}")
private String email;

@Value("${eknown.uri}")
private String url;

注意:使用@Value注解的時候畔师,所在類必須被Spring容器管理娶靡,也就是被@Component牧牢、@Controller看锉、@Service等注解定義的類姿锭。

2.2.2 獲取多個配置項

第一種,定義一個bean類伯铣,通過@Value獲取多個配置項:

@Component
public class MyBean {

    @Value("${eknown.email}")
    private String email;

    @Value("${eknown.uri}")
    private String uri;

    public String getEmail() {
        return email;
    }

    public String getUri() {
        return uri;
    }
}

然后我們通過get方法來獲取這些值:

@RestController
public class IndexAction {
  
    @Autowired
    private MyBean bean;

    @GetMapping(value = "bean")
    public String getConcatByBean() {
        return "from bean: <br />" + bean.getEmail() + "<br />" + bean.getUri();
    }

}

第二種呻此,使用注解@ConfigurationProperties:

@Component
@ConfigurationProperties(perfix="eknown")
public class MyConfigBean {

  private String email;
  private String uri;
}

這里只需要通過prefix指定前綴即可,后面的值自動匹配腔寡。

這里我們還使用了@Component注解來讓spring容器管理這個MyConfigBean焚鲜。

此外,我們可以不需要引入@Component放前,轉(zhuǎn)而在Application啟動類上加上@EnableConfigurationProperties({MyConfigBean.class})來啟動這個配置忿磅。

注意:我們這里是從主配置文件,也就是SpringBoot默認的application-profile文件中獲取配置數(shù)據(jù)的凭语。

而從自定義的配置文件葱她,比如test.yml這種形式中獲取配置項時,情況是有點不大一樣的似扔。


三吨些、自定義配置文件

上面介紹的配置文件都是springboot默認的application開頭的文件。如果要自定義一個配置文件呢炒辉,比如test.yml或test.properties豪墅,怎么獲取其中的配置項呢?

使用@PageResource注解即可黔寇。

首先我們來看一下讀取自定義的properties文件里的內(nèi)容:

test.properties

hello.time=2019.11.19
hello.name=eknown

定義Configuration類:

@Configuration
@PropertySource("classpath:test.properties")
//@PropertySource("classpath:test.yml") // 注意偶器,yml文件不能直接這樣寫,會讀不出數(shù)據(jù)
@ConfigurationProperties(prefix = "hello")
public class TestConfiguration {
    private String name;
    private String time;

    // hide get and set methods
}

測試一下:

@RestController
@RequestMapping(value = "test")
public class TestAction {

    @Autowired
    private TestConfiguration testConfiguration;

    @GetMapping(value = "config")
    public String test() {
        return testConfiguration.getName() + "<br/>" + testConfiguration.getTime();
    }
}

如果將properties文件換成yml文件呢缝裤?

我們嘗試一下状囱,發(fā)現(xiàn):

讀不出數(shù)據(jù)?

分析一下@PropertySource注解倘是,發(fā)現(xiàn)其使用的PropertySourceFactory是DefaultPropertySourceFactory.

這個類的源碼如下:

public class DefaultPropertySourceFactory implements PropertySourceFactory {
    public DefaultPropertySourceFactory() {
    }

    public PropertySource<?> createPropertySource(@Nullable String name, EncodedResource resource) throws IOException {
        return name != null ? new ResourcePropertySource(name, resource) : new ResourcePropertySource(resource);
    }
}

這個類只能處理properties文件亭枷,無法處理yml文件。所以我們需要自定義一個YmlSourceFactory搀崭。

public class YamlSourceFactory extends DefaultPropertySourceFactory {

    @Override
    public PropertySource<?> createPropertySource(String name, EncodedResource resource) throws IOException {
        return new YamlPropertySourceLoader().load(resource.getResource().getFilename()
                , resource.getResource()).get(0);
    }
}

然后定義test.yml文件的config類:

@Configuration
@PropertySource(value = "classpath:test.yml", encoding = "utf-8", factory = YamlSourceFactory.class)
@ConfigurationProperties(prefix = "yml.hello")
public class TestYamlConfiguration {
    private String name;
    private String time;

    // hide get and set methods
}

注:為了區(qū)分test.properties和test.yml叨粘,這里的test.yml中的屬性以yml.hello開頭。

編寫一下測試:

    @Autowired
    private TestYamlConfiguration ymlConfiguration;

    @GetMapping(value = "yml")
    public String testYml() {
        return "yml config: <br/>" + ymlConfiguration.getName() + "<br/>" + ymlConfiguration.getTime();
    }

訪問:


四瘤睹、補充@ConfigurationProperties

網(wǎng)上一些資料中升敲,為配合使用@ConfigurationProperties,還使用了@EnableConfigurationProperties注解轰传。

經(jīng)過測試發(fā)現(xiàn):

  1. 從SpringBoot默認配置文件讀取配置信息驴党,使用@ConfigurationProperties + @Component/@Configuration,或者@ConfigurationProperties + 在啟動類添加@EnableConfigurationProperties({class})获茬。這兩種方式都能解決問題

  2. 從非默認配置文件讀取配置信息港庄,需要利用@PropertySource注解倔既。同樣兩種方式:

    2.1 @PropertySource + @ConfigurationProperties + @Component/@Configuration

    2.2 @PropertySource + @ConfigurationProperties + @Component/@Configuration + @EnableConfigurationProperties,第二種方式存在一個問題鹏氧,即還是必須要使用@Component注解渤涌,如果不使用,則會導致讀取配置信息為null把还,但程序不會報錯实蓬;而如果采用了,則會導致bean類的set方法被執(zhí)行兩次(也就是生成了兩個同樣類型的bean類)吊履。這種方式不建議安皱!


交流學習

個人網(wǎng)站:http://www.eknown.cn

GitHub:https://github.com/laolunsi

公眾號:猿生物語,"分享技術(shù)艇炎,也感悟人生"练俐,歡迎關(guān)注!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末冕臭,一起剝皮案震驚了整個濱河市腺晾,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌辜贵,老刑警劉巖悯蝉,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異托慨,居然都是意外死亡鼻由,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門厚棵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蕉世,“玉大人,你說我怎么就攤上這事婆硬『萸幔” “怎么了?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵彬犯,是天一觀的道長向楼。 經(jīng)常有香客問我,道長谐区,這世上最難降的妖魔是什么湖蜕? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮宋列,結(jié)果婚禮上昭抒,老公的妹妹穿的比我還像新娘。我一直安慰自己灭返,他們只是感情好盗迟,可當我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著婆殿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪罩扇。 梳的紋絲不亂的頭發(fā)上婆芦,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天,我揣著相機與錄音喂饥,去河邊找鬼消约。 笑死,一個胖子當著我的面吹牛员帮,可吹牛的內(nèi)容都是我干的或粮。 我是一名探鬼主播,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼捞高,長吁一口氣:“原來是場噩夢啊……” “哼氯材!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起硝岗,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤氢哮,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后型檀,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體冗尤,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年胀溺,在試婚紗的時候發(fā)現(xiàn)自己被綠了裂七。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡仓坞,死狀恐怖背零,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情无埃,我是刑警寧澤捉兴,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站录语,受9級特大地震影響倍啥,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜澎埠,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一虽缕、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蒲稳,春花似錦氮趋、人聲如沸伍派。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽诉植。三九已至,卻和暖如春昵观,著一層夾襖步出監(jiān)牢的瞬間晾腔,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工啊犬, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留灼擂,地道東北人。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓觉至,卻偏偏與公主長得像剔应,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子语御,可洞房花燭夜當晚...
    茶點故事閱讀 43,465評論 2 348

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