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}'
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文件之外新建兩個文件:
application-dev.yml
server: port: 8080
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):
從SpringBoot默認配置文件讀取配置信息驴党,使用@ConfigurationProperties + @Component/@Configuration,或者@ConfigurationProperties + 在啟動類添加@EnableConfigurationProperties({class})获茬。這兩種方式都能解決問題
從非默認配置文件讀取配置信息港庄,需要利用@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)注!