新建 Spring Boot 項(xiàng)目
這個(gè)部分 Idea,Spring Boot 官網(wǎng)工具都能夠創(chuàng)建 Spring Boot 項(xiàng)目些侍,這里省略妄田。
Spring Boot 工程的 pom.xml
新建的 Spring Boot 工程項(xiàng)目中的 pom.xml 文件有父依賴。
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.9.RELEASE</version>
</parent>
這塊配置就是Spring Boot父級(jí)依賴灭返,有了這個(gè)景用,當(dāng)前的項(xiàng)目就是Spring Boot項(xiàng)目了涵叮,spring-boot-starter-parent是一個(gè)特殊的starter,它用來(lái)提供相關(guān)的Maven默認(rèn)依賴惭蹂,使用它之后,常用的包依賴可以省去version標(biāo)簽割粮。
繼續(xù)看 spring-boot-starter-parent
的 pom.xml 文件盾碗,可以看到它還有父依賴。
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>1.5.9.RELEASE</version>
<relativePath>../../spring-boot-dependencies</relativePath>
</parent>
在 spring-boot-dependencies
的 pom.xml 文件中我們才看到了定義的一些第三方包的版本屬性信息舀瓢。
<properties>
<!-- Dependency versions -->
<activemq.version>5.14.5</activemq.version>
<antlr2.version>2.7.7</antlr2.version>
<appengine-sdk.version>1.9.59</appengine-sdk.version>
<artemis.version>1.5.5</artemis.version>
<aspectj.version>1.8.13</aspectj.version>
<assertj.version>2.6.0</assertj.version>
<atomikos.version>3.9.3</atomikos.version>
...
</properties>
這里只截取了一部分廷雅,完整的大家可以看一下 spring-boot-dependencies
的 pom.xml。
在 spring-boot-dependencies
中還定義了一些 starter。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>1.5.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<version>1.5.9.RELEASE</version>
</dependency>
...
這個(gè)就是我們?cè)?Spring Boot 項(xiàng)目中,添加了父依賴之后芳誓,添加 starter 和 一些第三方包的時(shí)候不用填寫 version 的秘密。
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.9.RELEASE</version>
</parent>
如果你不想使用 Spring Boot 指定的第三方包的版本芥玉,你可以在自己的項(xiàng)目中定義第三方依賴項(xiàng)的版本來(lái)覆蓋 Spring Boot 指定的版本。比如 spring-boot-dependencies
中指定了 logback
的版本為 1.1.11
备图。
<logback.version>1.1.11</logback.version>
現(xiàn)在我們想在自己的項(xiàng)目中使用 logback
的版本是 1.2.3
灿巧,可以在自己的項(xiàng)目 pom.xml 文件 properties
中重新指定一下 logback
的版本即可。
<properties>
<logback.version>1.2.3</logback.version>
...
</properties>
當(dāng)然并不是每個(gè)人都愿意繼承 spring-boot-starter-parent
這個(gè)父依賴的揽涮。這個(gè)可能是因?yàn)樽约汗緯?huì)提供標(biāo)準(zhǔn)的 parent 父依賴(比如筆者公司就使用 inf-bom 來(lái)指定公司基礎(chǔ)組件的版本信息)抠藕。如果遇到這種情況,不能依賴 spring-boot-starter-parent
蒋困,但是又想使用 spring-boot-starter-parent
提供的依賴管理功能盾似,這樣就可以不用寫 version 了,這個(gè)時(shí)候可以通過(guò)使用 scope = import
依賴關(guān)系來(lái)保持依賴關(guān)系管理:
<dependencyManagement>
<dependencies>
<dependency>
<!-- Import dependency management from Spring Boot -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>1.5.9.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
使用這種方式來(lái)管理依賴關(guān)系時(shí)雪标,如果想使用自定義第三方版本時(shí)零院,不能使用前面提到的在自己的項(xiàng)目 pom.xml 文件 properties
中重新指定一下第三方 jar 包版本。要實(shí)現(xiàn)相同的結(jié)果汰聋,您需要在 spring-boot-dependencies
項(xiàng)之前的項(xiàng)目的 dependencyManagement 中添加一個(gè)配置门粪,例如,要升級(jí)到另一個(gè) logback 版本烹困,您可以將以下內(nèi)容添加到pom.xml 中。
<dependencyManagement>
<dependencies>
<!-- Override Spring Data release train provided by Spring Boot -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
<scope>import</scope>
<type>pom</type>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>1.5.9.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
Spring Boot 的配置文件
Spring Boot使用了一個(gè)全局的配置文件application.properties乾吻,放在src/main/resources目錄下或者類路徑的/config下髓梅。Sping Boot的全局配置文件的作用是對(duì)一些默認(rèn)配置的配置值進(jìn)行修改。
自定義屬性
com.elvis.name="懶癌正患者"
com.elvie.wish="希望世界和平"
然后直接在要使用的地方通過(guò)注解@Value(value=”${config.name}”)就可以綁定到你想要的屬性上面
@RestController
public class UserController {
@Value("${com.elvis.name}")
private String name;
@Value("${com.elvie.wish}")
private String wish;
@GetMapping("hello")
public ResultView hello() {
return ResultView.builder().data(name + wish).build();
}
}
此時(shí)在瀏覽器中訪問這個(gè)路徑就能看到響應(yīng)結(jié)果
{
"code": 0,
"message": "success",
"data": "懶癌正患者希望世界和平"
}
但是當(dāng)自定義的配置屬性比較多绎签,使用這種方式來(lái)一個(gè)一個(gè)綁定到屬性上枯饿,是不是很麻煩
@Value("${com.elvis.name}")
private String name;
@Value("${com.elvie.wish}")
private String wish;
這個(gè)時(shí)候可以定義一個(gè)配置類,這里我定義為 ElvisConfig
, 頂部需要使用注解 @ConfigurationProperties(prefix = "com.elvis")
來(lái)指明使用哪個(gè)
@Data
@ConfigurationProperties(prefix = "com.elvis")
public class ElvisConfig {
private String name;
private String wish;
}
這里配置完還需要在 Spring Boot 入口類加上@EnableConfigurationProperties
并指明要加載哪個(gè)bean诡必。
@SpringBootApplication
@EnableConfigurationProperties({ElvisConfig.class})
public class Aggregation {
public static void main(String[] args) {
SpringApplication.run(Aggregation.class, args);
}
}
@RestController
public class UserController {
@Autowired
private ElvisConfig elvisConfig;
@GetMapping("hello")
public ResultView hello() {
return ResultView.builder().data(elvisConfig.getName() + elvisConfig.getWish()).build();
}
}
參數(shù)間引用
在 application.properties
中的各個(gè)參數(shù)之間也可以直接引用來(lái)使用奢方,就像下面的設(shè)置:
com.elvis.name="懶癌正患者"
com.elvie.wish="希望世界和平"
com.elvis.says=${com.elvis.name}說(shuō)${com.elvie.wish}
使用自定義配置文件
有時(shí)候我們不希望把所有配置都放在application.properties
里面搔扁,這時(shí)候我們可以另外定義一個(gè),這里我明取名為test.properties,
路徑跟也放在src/main/resources下面蟋字。
test.properties
的內(nèi)容
com.elvis.name="懶癌正患者"
com.elvie.wish="希望世界和平"
我們新建一個(gè)bean類稿蹲,如下:
@Data
@Configuration
@ConfigurationProperties(prefix = "com.elvis")
@PropertySource("classpath:test.properties")
public class ConfigTestBean {
private String name;
private String wish;
}
這里要注意哦,有一個(gè)問題鹊奖,如果你使用的是1.5以前的版本苛聘,那么可以通過(guò)locations指定properties文件的位置,這樣:
@ConfigurationProperties(prefix = "com.elvis",locations="classpath:test.properties")
但是1.5版本后就沒有這個(gè)屬性了忠聚,找了半天發(fā)現(xiàn)添加@Configuration
和@PropertySource(“classpath:test.properties”)
后才可以讀取设哗。
配置文件的優(yōu)先級(jí)
application.properties
和application.yml
文件可以放在以下四個(gè)位置:
- 外置,在相對(duì)于應(yīng)用程序運(yùn)行目錄的/congfig子目錄里两蟀。
- 外置网梢,在應(yīng)用程序運(yùn)行的目錄里
- 內(nèi)置,在config包內(nèi)
- 內(nèi)置赂毯,在Classpath根目錄
同樣澎粟,這個(gè)列表按照優(yōu)先級(jí)排序,也就是說(shuō)欢瞪,src/main/resources/config下application.properties覆蓋src/main/resources下application.properties中相同的屬性活烙,此外,如果你在相同優(yōu)先級(jí)位置同時(shí)有application.properties和application.yml遣鼓,那么application.properties里的屬性里面的屬性就會(huì)覆蓋application.yml啸盏。
Profile-多環(huán)境配置
當(dāng)應(yīng)用程序需要部署到不同運(yùn)行環(huán)境時(shí),一些配置細(xì)節(jié)通常會(huì)有所不同骑祟,最簡(jiǎn)單的比如日志回懦,生產(chǎn)日志會(huì)將日志級(jí)別設(shè)置為WARN或更高級(jí)別,并將日志寫入日志文件次企,而開發(fā)的時(shí)候需要日志級(jí)別為DEBUG怯晕,日志輸出到控制臺(tái)即可。
如果按照以前的做法缸棵,就是每次發(fā)布的時(shí)候替換掉配置文件舟茶,這樣太麻煩了,Spring Boot的Profile就給我們提供了解決方案堵第,命令帶上參數(shù)就搞定吧凉。
這里我們來(lái)模擬一下,只是簡(jiǎn)單的修改端口來(lái)測(cè)試
在Spring Boot中多環(huán)境配置文件名需要滿足application-{profile}.properties
的格式踏志,其中{profile}
對(duì)應(yīng)你的環(huán)境標(biāo)識(shí)阀捅,比如:
- application-dev.properties:開發(fā)環(huán)境
- application-prod.properties:生產(chǎn)環(huán)境
想要使用對(duì)應(yīng)的環(huán)境,只需要在application.properties中使用spring.profiles.active屬性來(lái)設(shè)置针余,值對(duì)應(yīng)上面提到的{profile}饲鄙,這里就是指dev凄诞、prod這2個(gè)。
當(dāng)然你也可以用命令行啟動(dòng)的時(shí)候帶上參數(shù):
java -jar xxx.jar --spring.profiles.active=dev
我給不同的環(huán)境添加不同的端口屬性server.port
忍级,然后根據(jù)指定不同的spring.profiles.active
來(lái)切換使用帆谍。各位可以自己試試。這里就不貼代碼了颤练。