實(shí)際開發(fā)中我們需要為不同的環(huán)境做不同的配置嫡良,如下圖:
有好幾種方式可以指定使用哪一個(gè)配置文件翩蘸,下面一一舉例
1. application.yml
application.yml是默認(rèn)使用的配置文件,在其中通過spring.profiles.active
設(shè)置使用哪一個(gè)配置文件析校,下面代碼表示使用application.prod.yml配置荆责,如果application.prod.yml和application.yml配置了相同的配置,比如都配置了運(yùn)行端口盗扇,那application.prod.yml會(huì)覆蓋application.yml的配置
#需要使用的配置文件
spring:
profiles:
active: prod
#spring.profiles.include屬性用來設(shè)置無條件的激活哪些profile
#include: prod
2. VM options、Program arguments唯卖、Active Profile
VM options設(shè)置啟動(dòng)參數(shù) -Dspring.profiles.active=prod
Program arguments設(shè)置 --spring.profiles.active=prod
Active Profile 設(shè)置 prod
這三個(gè)參數(shù)不要一起設(shè)置粱玲,會(huì)引起沖突,選一種即可拜轨,如下圖
3. 命令行
將項(xiàng)目打成jar包,在jar包的目錄下打開命令行允青,使用如下命令啟動(dòng):
java -jar spring-boot-profile.jar --spring.profiles.active=prod
上面是profile在配置文件上的應(yīng)用橄碾,同時(shí)profile還可以用在類上卵沉,spring提供了@Peofile
注解可以實(shí)現(xiàn)不同環(huán)境下配置參數(shù)的切換,任何@Component
或@Configuration
注解的類都可以使用@Profile
注解法牲。
我們可以在配置類上使用@Profile
注解史汗,如下,該配置只會(huì)在prod環(huán)境下生效
@Configuration
@Profile("prod")
public class ProductionConfiguration {
// ...
}
如果在實(shí)現(xiàn)類上加上@Profile
注解拒垃,則可以實(shí)現(xiàn)注入接口時(shí)根據(jù)當(dāng)時(shí)的配置環(huán)境動(dòng)態(tài)注入對(duì)應(yīng)的實(shí)現(xiàn)類停撞。下面是一個(gè)例子:
有一個(gè)HelloService接口
package com.along.service;
public interface HelloService {
String hello();
}
對(duì)HelloService接口做了兩個(gè)實(shí)現(xiàn),分別對(duì)應(yīng)于生產(chǎn)環(huán)境和開發(fā)環(huán)境悼瓮,如下
package com.along.service;
import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Service;
/**
* 生產(chǎn)環(huán)境實(shí)現(xiàn)類
*/
@Service
@Profile("dev")
public class DevServiceImpl implements HelloService {
@Override
public String hello() {
return "use dev";
}
}
package com.along.service;
import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Service;
/**
* 開發(fā)環(huán)境實(shí)現(xiàn)類
*/
@Service
@Profile("prod")
public class ProdServiceImpl implements HelloService {
@Override
public String hello() {
return "use prod";
}
}
然后寫一個(gè)接口調(diào)用HelloService
package com.along.controller;
import com.along.service.HelloService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@Autowired
private HelloService helloService;
@RequestMapping("hello")
public String sayHello(){
return helloService.hello();
}
}
當(dāng)前啟用的配置環(huán)境是prod戈毒,application.yml配置如下
spring:
profiles:
active: prod
啟動(dòng)項(xiàng)目,瀏覽器訪問http://localhost:8082/hello横堡,接口返回use prod
埋市,再改變application.yml配置,啟用dev命贴,重啟項(xiàng)目道宅,再次訪問接口返回use dev
,說明@Profile注解起到了作用胸蛛,實(shí)現(xiàn)了根據(jù)當(dāng)時(shí)的配置環(huán)境動(dòng)態(tài)的選擇相應(yīng)的實(shí)現(xiàn)類污茵。
maven中的場景配置
使用maven的resource filter可以實(shí)現(xiàn)多場景切換。在pom.xml文件中添加如下配置
<profiles>
<profile>
<id>dev</id>
<properties>
<profileActive>dev</profileActive>
</properties>
</profile>
<profile>
<id>prod</id>
<properties>
<profileActive>prod</profileActive>
</properties>
</profile>
<profile>
<id>test</id>
<properties>
<profileActive>test</profileActive>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
</profiles>
<build>
<resources>
<resource>
<filtering>true</filtering>
<directory>src/main/resources</directory>
<includes>
<include>application.yml</include>
<include>application-${profileActive}.yml</include>
</includes>
</resource>
</resources>
</build>
這樣在maven編譯時(shí)葬项,可以通過-P
參數(shù)指定maven profile泞当。
源碼地址
https://github.com/alonglong/spring-boot-all/tree/master/spring-boot-profile