6.高级特性
(1).Profile功能
为了方便多环境适配,springboot简化了profile功能。
(1.1).application-profile功能
- 默认配置文件 application.yaml;任何时候都会加载
- 指定环境配置文件
application-{env}.yaml
- 激活指定环境
- 配置文件激活
- 命令行激活:
java -jar xxx.jar --spring.profiles.active=prod --person.name=haha
- 默认配置与环境配置同时生效
- 同名配置项,profile配置优先
spring.profiles.active=test
• 1

(1.2).@Profile条件装配功能
只要在我们指定的环境中,我们某个类才会有效。
1.接口
package com.jsxs.bean;
/**
* @Author Jsxs
* @Date 2023/7/29 11:38
* @PackageName:com.jsxs.bean
* @ClassName: Human
* @Description: TODO
* @Version 1.0
*/
public interface Human {
void getName();
}
2.老板在开发环境下有效
package com.jsxs.bean;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Component;
/**
* @Author Jsxs
* @Date 2023/7/29 11:38
* @PackageName:com.jsxs.bean
* @ClassName: Boos
* @Description: TODO
* @Version 1.0
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Component
@ConfigurationProperties("human")
@Profile("prod")
public class Boos implements Human{
private String name;
@Override
public void getName() {
System.out.println(name);
}
}
3.员工在生产环境下有效
package com.jsxs.bean;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Component;
/**
* @Author Jsxs
* @Date 2023/7/29 11:39
* @PackageName:com.jsxs.bean
* @ClassName: worker
* @Description: TODO
* @Version 1.0
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Component
@ConfigurationProperties("human")
@Profile("dev")
public class worker implements Human{
private String name;
@Override
public void getName() {
System.out.println(name);
}
}
application-prod.yaml
application-dev.yaml
(1.3).profile分组
激活一个组,那么这个组的所有配置文件都有效
spring.profiles.group.production[0]=dev
spring.profiles.group.production[1]=test
使用:--spring.profiles.active=production 同时激活了dev环境和test环境
(2).外部化配置 - 配置加载优先级
https://docs.spring.io/spring-boot/docs/current/reference/html/spring-boot-features.html#boot-features-external-config
(2.3).外部配置源
常用:Java属性(Properties)文件、YAML文件、环境变量、命令行参数;
- 测试环境变量 (EL表达式获取一切)
我们通过 EL 表达式 可以获取电脑的环境变量和系统变量。
- 查看怎么写Key的关键字
package com.jsxs;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.core.env.ConfigurableEnvironment;
import java.util.Map;
@SpringBootApplication
@ServletComponentScan
public class SpringBootLs02Application {
public static void main(String[] args) {
ConfigurableApplicationContext run = SpringApplication.run(SpringBootLs02Application.class, args);
// 获取环境变量
ConfigurableEnvironment environment = run.getEnvironment();
Map<String, Object> systemEnvironment = environment.getSystemEnvironment();
System.out.println(systemEnvironment);
}
}
2.真实获取
@Value("${os.name}")
private String osName;
@Test
void test8(){
System.out.println(osName);
}

(2.4).配置文件查找位置 (优先级依次递增,也就是后面的同名配置文件会覆盖前面的)
如果同名就覆盖,不同名就增强
- classpath 根路径
- classpath 根路径下config目录
- jar包当前目录
- jar包当前目录的config目录
- /config子目录的直接子目录
(2.3).配置文件加载顺序:
- 当前jar包内部的
application.properties
和application.yml
- 当前jar包内部的
application-{profile}.properties
和 application-{profile}.yml
- 引用的外部jar包的
application.properties
和application.yml
- 引用的外部jar包的
application-{profile}.properties
和 application-{profile}.yml
总结 : 指定环境优先,外部优先,后面的可以覆盖前面的同名配置项
(3).自定义Statr
(3.1).创建一个空项目
1. 并创建两个Model. 一个是配置项目;另一个是自动引入项目

2.将自动包的依赖包信息引入非自动包中
<!-- 非自动包的 -->
<dependency>
<groupId>com.jsxs</groupId>
<artifactId>atguigu-hello-spring-boot-starter-autoconfigure</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>

3.在自动包的项目中进行业务自动配置
