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
human: name: 老板
application-dev.yaml
human: name: 员工
(1.3).profile分组
激活一个组,那么这个组的所有配置文件都有效
spring.profiles.group.production[0]=dev spring.profiles.group.production[1]=test 使用:--spring.profiles.active=production 同时激活了dev环境和test环境
(2).外部化配置 - 配置加载优先级
(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.在自动包的项目中进行业务自动配置