profile用于多环境的激活和配置,用来切换生产,测试,本地等多套不通环境的配置。如果每次去更改配置就非常麻烦,profile就是用来切换多环境配置的。
三种方式。
在resource目录下新增三个配置文件,分别用于开发环境、测试环境、生产环境:
在主配置文件中就可以指定当前使用哪个配置文件,具体例如:
#控制激活指定后缀的文件,此时
#application-prod.properties文件会被激活
spring.profiles.active=prod
这样就激活了生产环境的配置,实际就会使用application-prod.properties(或application-prod.yml)下的配置。(注:yml和properties可以互通,application.properties可以激活yml后缀的配置文件,同样application.yml也可以激活application.properties文件)
上面是通过创建三个配置文件分离了不同环境下的配置,然后指定哪个就用哪个。而yml多文档实际上就是在一个yml配置文件下同时放了三个配置,用三个横杠分割不同的配置,这在yml中,就叫做多文档。本质上和方式一思路是一样的。
在每个块下指定自己的配置名称spring.profiles。然后再在最后设置spring.profiles.active以选择激活的配置。
#多文档配置方式
spring:
profiles: test
server:
port: 9081
--- #分割必须是三个横线,不能多不能少
spring:
profiles: dev
server:
port: 9082
--- #分割必须是三个横线,不能多不能少
spring:
profiles: prod
server:
port: 9083
--- #分割必须是三个横线,不能多不能少
spring:
profiles:
active: prod #激活使用spring.profiles=prod的配置块
在Spring中,可以使用配置文件的方式来指定不同环境下所需要的配置信息。但有时候,我们不通过配置文件,而是通过配置类的方式来指定不同环境下的配置信息,
此时就需要用到@Profile注解。
例如我们封装一个数据库的配置:
1)创建用来封装数据库信息的entity
import lombok.Builder;
import lombok.Data;
@Builder
@Data
public class DBInfoEntity {
private String url;
private String port;
private String userName;
private String password;
}
2)创建个配置接口:
public interface Config {
// 获取数据库信息
DBInfoEntity getDBInfo();
// 获取系统URL
String getSystemUrl();
}
3)@Profile注解作用于实现的配置类上:
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
@Configuration("MyConfig")
// 指定开发环境为dev
@Profile("dev")
public class MyConfig1 implements Config {
@Override
public DBInfoEntity getDBInfo() {
return DBInfoEntity.builder()
.url("https://127.0.0.1")
.port("8080")
.userName("devUser")
.password("110120")
.build();
}
@Override
public String getSystemUrl() {
return "https://www.dev.com";
}
}
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
@Configuration("MyConfig")
// 指定开发环境为product
@Profile("product")
public class MyConfig2 implements Config {
@Override
public DBInfoEntity getDBInfo() {
return DBInfoEntity.builder()
.url("https://127.0.0.2")
.port("8089")
.userName("prodUser")
.password("999000")
.build();
}
@Override
public String getSystemUrl() {
return "https://www.prod.com";
}
}
4)测试:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
@Component
public class Test32Controller implements CommandLineRunner {
// 注入接口,会自动从IOC容器中获取该接口的实现类
@Autowired
private Config config;
@Override
public void run(String... args) throws Exception {
DBInfoEntity dbInfo = config.getDBInfo();
System.out.println(dbInfo);
String systemUrl = config.getSystemUrl();
System.out.println(systemUrl);
}
}
5)效果
激活方式有以下三种。激活顺序优先级:命令行参数 > 虚拟机参数 > 配置文件
就是前面说的,在配置文件中通过设置spring.profiles.active,选择使用哪个配置文件。
在IDEA中设置
-Dspring.profiles.active=test
在IDEA中设置
--spring.profiles.active=dev
这样就相当于在启动这个jar包时,自动在命令行注入了我们的参数spring.profiles.active=dev
当然也可以我们在生产环境中启动jar包时自己在命令行输入参数。具体如下:
1)打包项目mvn package
2)运行项目(以下三个命令之一即可)
#打包的配置文件里的默认激活方式
java -jar .\springboot-profile04-0.0.1-SNAPSHOT.jar
#激活dev配置文件运行项目(项目参数)
java -jar .\springboot-profile04-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev
#激活test配置文件运行项目(虚拟机参数)
java -jar -Dspring.profiles.active=test .\springboot-profile04-0.0.1-SNAPSHOT.jar