SpringBoot 从入门到光头 —— 第九章 自定义
1. Profile 功能
为了方便多环境适配,SpringBoot 简化了 Profile 功能
1.1. application-profile
功能
- 默认配置文件
application.yaml
任何时候都会加载 - 指定环境配置文件
application-[environmrent].yaml
- 指定激活环境
- 配置文件激活
- 命令行激活:
java -jar xxx.jar --spring.profiles.active=prod -person.name=yourname
- 修改配置文件的任意值,命令行优先
- 默认配置与环境配置同时生效
- 同名配置项,Profile 配置优先
示例代码:
application.yaml
person:
name: gregPerlinLi
spring:
profiles:
active: prod # Specifies the active environment. Both the default profile and the profile for the specified environment take effect
server:
port: 8080
applicton-prof.yaml
person:
name: gregPerlinLi-prod
server:
port: 8000
application-test.yaml
person:
name: gregPerlinLi-test
server:
port: 8888
com.yourname.boot.controller.HelloController
/**
* @author gregPerlinLi
* @since 2021-11-23
*/
@RestController
public class HelloController {
@Value("${person.name: DefaultName}")
private String name;
@GetMapping(value = "/")
public String hello() {
return "Hello " + name;
}
}
1.2. @Profile
条件的装配功能
使用示例:
@Configuration(proxyBeanMethods = false)
@Profile("production")
public class ProductionConfiguration {
// ...
}
示例代码:
com.yourname.boot.bean.Person
/**
* @author gregPerlinLi
* @since 2021-11-23
*/
public interface Person {
/**
* Get name
*
* @return name
*/
String getName();
/**
* Get age
*
* @return age
*/
Integer getAge();
}
com.yourname.boot.bean.Boss
/**
* @author gregPerlinLi
* @since 2021-11-23
*/
@Component
@Profile("prod")
@Data
@ConfigurationProperties("person")
public class Boss implements Person {
private String name;
private Integer age;
}
com.yourname.boot.bean.Staff
/**
* @author gregPerlinLi
* @since 2021-11-23
*/
@Component
@Profile("test")
@Data
@ConfigurationProperties("person")
public class Staff implements Person {
private String name;
private Integer age;
}
com.yourname.boot.controller.HelloController
/**
* @author gregPerlinLi
* @since 2021-11-23
*/
@RestController
public class HelloController {
@Value("${person.name: DefaultName}")
private String name;
@Autowired
private Person person;
@GetMapping(value = "/")
public String hello() {
return person.getClass().toString();
}
}
1.3. Profile 分组
使用示例:
spring:
profiles:
group:
production:
- proddb
- prodmq
2. 外部化配置
- Default properties (specified by setting
SpringApplication.setDefaultProperties
)。@PropertySource
annotations on your@Configuration
classes. Please note that such property sources are not added to theEnvironment
until the application context is being refreshed. This is too late to configure certain properties such aslogging.*
andspring.main.*
which are read before refresh begins.- Config data (such as
application.properties
files)- A
RandomValuePropertySource
that has properties only inrandom.*
.- OS environment variables.
- Java System properties (
System.getProperties()
).- JNDI attributes from
java:comp/env
.ServletContext
init parameters.ServletConfig
init parameters.- Properties from
SPRING_APPLICATION_JSON
(inline JSON embedded in an environment variable or system property).- Command line arguments.
properties
attribute on your tests. Available on@SpringBootTest
and the test annotations for testing a particular slice of your application.@TestPropertySource
annotations on your tests.- Devtools global settings properties in the
$HOME/.config/spring-boot
directory when devtools is active.
2.1. 外部配置源
常用: Java属性文件、YAML文件、环境变量、命令行参数 …
2.2. 配置文件查找位置
classpath
根路径classpath
根路径下config
目录- Jar 包当前目录
- Jar 包当前目录的
config
目录 /config
子目录的直接子目录
2.3. 配置文件的加载顺序
- 当前 Jar 包内部的
application.properties
和application.yaml
- 当前 Jar 包内部的
application-{profile}.properties
和application-{profile}.yaml
- 引用的外部 Jar 包的
application.properties
和application.yaml
- 引用的外部 Jar包的
application-{profile}.properties
和application-{profile}.yml
2.4. 总结
指定环境优先,外部优先,后面的可以覆盖前面的同名配置项
3. 自定义 starter
3.1. sterter
启动原理
starter-pom
引入autoconfigurer
包autoconfigurer
包中配置使用使用META-INF/spring.factories
中EnableAutoConfiguration
的值,使得项目启动加载指定的自动配置类编写自动配置类
xxxAutoConfigure
→xxxProperties
@Configuration
@Conditional
EnableConfigurationProperties
@Bean
- …
引入 starter
→ xxxAutoConfiguration
→ 容器中放入组件 → 绑定 xxxProperties
→ 配置项
3.2. 自定义 starter
atguigu-hello-spring-boot-starter
:启动器atguigu-hello-spring-boot-starter-autoconfigure
:自动配置包