SpringBoot實現(xiàn)多環(huán)境配置文件切換教程詳解
背景
很多時候,我們項目在開發(fā)環(huán)境和生成環(huán)境的環(huán)境配置是不一樣的,例如,數(shù)據(jù)庫配置,在開發(fā)的時候,我們一般用測試數(shù)據(jù)庫,而在生產(chǎn)環(huán)境的時候,我們是用正式的數(shù)據(jù),這時候,我們可以利用profile在不同的環(huán)境下配置用不同的配置文件或者不同的配置。
解決方案
spring boot允許你通過命名約定按照一定的格式(application-{profile}.properties)來定義多個配置文件,然后通過在application.properyies通過spring.profiles.active來具體激活一個或者多個配置文件,如果沒有沒有指定任何profile的配置文件的話,spring boot默認會啟動application-default.properties。
一、新建配置文件
注:配置文件優(yōu)先級(由高到低):bootstrap.properties -> bootstrap.yml -> application.properties -> application.yml
此處使用.yml文件格式,在src/main/resources下新建如下文件

application.yml (主配置)
server:
port: 9990
spring:
profiles:
active: dev #選定配置
#自定義默認值
curvar:
context: default.curvarapplication-pro.yml (開發(fā)配置)
#模擬開發(fā)配置 curvar: context: "開發(fā)配置變量"
application-pro.yml(生產(chǎn)配置)
#模擬生產(chǎn)配置 curvar: context: "生產(chǎn)配置變量"
二、 服務調(diào)用測試
2.1 新建調(diào)用類
@Slf4j
@RestController
public class IndexController {
@Value("${curvar.context}")
private String cusvar;
/**
* .
* 使用哪一個配置
*
* @return
*/
@RequestMapping("/test")
public String test() {
log.debug("使用:[{}]", cusvar);
return "使用配置: " + cusvar;
}
}2.2 使用樣例項目
打開瀏覽器輸入:http://localhost:9990/test


三、擴展練習
3.1 使用注解標記配置,首先定義一個接口
public interface Connector {
String configure();
}3.2 分別定義倆個實現(xiàn)類來實現(xiàn)它
import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Component;
@Component
@Profile("pro-db")//標記文件,環(huán)境切換
public class ProConnector implements Connector {
@Override
public String configure() {
return "pro生產(chǎn)標記文件...";
}
}import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Component;
@Component
@Profile("dev-db")//標記文件,環(huán)境切換
public class DevConnector implements Connector {
@Override
public String configure() {
return "dev開發(fā)標記文件...";
}
}3.3 修改application.yml文件激活配置
spring:
profiles:
#active: dev #選定配置
active: pro-db #選定配置激活標記文件3.4 新增查詢方法
@Autowired
private Connector connector; //注入
/**
* .
* 使用哪一個被標記文件
*
* @return
*/
@GetMapping("/proFile")
public String proFile() {
log.debug("使用配置文件:[{}]", connector.configure());
return connector.configure();
}打開瀏覽器輸入:http://localhost:9990/proFile

3.5 使用一個或多個配置文件及激活標記文件
修改application.yml文件,進行屬性疊加
spring:
profiles:
include: pro,dev-db #指定配置文件及激活標記文件
#active: pro-db #選定標記文件新增查詢方法
/**
* .
* 使用哪一個配置文件及標記文件
*
* @return
*/
@GetMapping("/include")
public String include() {
return String.format("使用配置文件:%s,使用標記文件:%s", cusvar, connector.configure());
}打開瀏覽器輸入:http://localhost:9990/include

3.6 切換日志文件
新建logback文件

logback-pro.yml (生產(chǎn)日志)
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true">
<contextName>logback</contextName>
<!--定義文件名及存儲路徑-->
<property name="log.path" value="./pro.log"/>
<!-- ConsoleAppender:控制臺設置 -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>debug</level>
</filter>
<encoder>
<pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} [%file : %line] - %msg%n
</pattern>
</encoder>
</appender>
<!--RollingFileAppender:滾動記錄文件,先將日志記錄到指定文件-->
<appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}.%d{yyyy-MM-dd}.%i.gz</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!-- 每產(chǎn)生一個日志文件,該日志文件的保存期限為7天 -->
<maxHistory>7</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%date %level [%thread] %logger{36} [%file : %line] %msg%n
</pattern>
</encoder>
</appender>
<!--將上述name名稱:console:標簽名稱為debug-->
<root level="debug">
<appender-ref ref="console"/>
</root>
<!--將上述name名稱:file:標簽名稱為info-->
<root level="info">
<appender-ref ref="file"/>
</root>
<logger name="org.springframework.scheduling" level="error"/>
<Logger name="org.apache.catalina.util.LifecycleBase" level="error"/>
<Logger name="org.apache.coyote.http11.Http11NioProtocol" level="warn"/>
<Logger name="org.apache.tomcat.util.net.NioSelectorPool" level="warn"/>
<Logger name="org.springframework" level="info"/>
<Logger name="org.freeswitch.esl" level="warn"/>
<logger name="java.sql" level="error"/>
<logger name="org.mybatis" level="info"/><!--mybatis的日志級別為info-->
<logger name="com.example" level="debug"/><!--com.hy包下的日志級別為debug-->
</configuration>修改application.yml文件,配置日志屬性
spring:
profiles:
#include: pro,dev-db #指定配置文件及激活標記文件
#active: pro-db #選定標記文件
active: pro #指定配置文件
#日志
logging:
config: classpath:logback-${spring.profiles.active}.xml #本地IDEA啟動配置
#config: config/logback-${spring.profiles.active}.xml # java -jar 包啟動配置項目啟動訪問接口,控制臺打印日志

友情提示:jar運行指定配置
java -jar xxx.jar --spring.profiles.active=dev #指定dev配置 java -jar xxx.jar --server.port=9090 #指定啟動端口
以上就是SpringBoot實現(xiàn)多環(huán)境配置文件切換教程詳解的詳細內(nèi)容,更多關(guān)于SpringBoot配置文件切換的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
教你如何使用Java8實現(xiàn)菜單樹形數(shù)據(jù)
今天給大家?guī)淼氖顷P(guān)于JAVA的相關(guān)知識,文中圍繞著如何使用Java8實現(xiàn)菜單樹形數(shù)據(jù)展開,文中有非常詳細的介紹及代碼示例,需要的朋友可以參考下2021-06-06
Java實現(xiàn)XML與JSON秒級轉(zhuǎn)換示例詳解
這篇文章主要為大家介紹了Java實現(xiàn)XML與JSON秒級轉(zhuǎn)換示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-09-09
Spring Boot整合RabbitMQ實例(Topic模式)
Topic Exchange 轉(zhuǎn)發(fā)消息主要是根據(jù)通配符。接下來通過本文給大家分享Spring Boot整合RabbitMQ實例(Topic模式),需要的朋友參考下吧2017-04-04
Java中NoClassDefFoundError?和?ClassNotFoundException的區(qū)別
Java中NoClassDefFoundError和ClassNotFoundException的區(qū)別,從類繼承層次上來看,ClassNotFoundException是從Exception繼承的,所以ClassNotFoundException是一個檢查異常。具體詳情需要的朋友可以參考下面文章內(nèi)容2022-06-06

