一、Springboot 特性
- 方便创建可独立运行的spring应用程序
- 直接内嵌Tomcat等服务
- 简化了项目的构建配置
- 为spring及第三方库提供自动配置
- 提供生产级特性
- 无需生成代码或者进行xml配置
二、四大核心
- 自动配置
- 起步依赖
- 命令行界面
- Actuator - 生成级的特性
三、自动配置的实现原理
- 自动配置
- 基于添加JAR依赖自动对Spring Boot应用程序进行配置
- spring-boot-autoconfiguration
- 开启自动配置
- @EnableAutoConfiguration
- exclude = Class<?> []
- @SpringBootApplication
- @EnableAutoConfiguration
四、@EnableAutoConfiguration
-
@Import({AutoConfigurationImportSelector.class})
-
META-INF/spring.factories
-
org.springframework.boot.autoconfigure.AutoConfiguratio
-
-
- 条件注解
- @Conditional
- @ConditionalOnClass
- @ConditionalOnBean
- @ConditionalOnMissingBean
- @ConditionalOnProperty
- ...
-
- 了解自动配置的情况
- 观察自动配置的判断结果
- 命令行添加: --debug
- CONDITIONS EVALUATION REPORT
- Positive matches
- Negative matches
- Exclusions
- Unconditional classes
- 观察自动配置的判断结果
测试用例:
![]() |
![]() |
todo:手写一个自动配置
五、起步依赖
- 直接面向功能
- 一站获得所有相关依赖,不再复制粘贴
- 官方的Starters:如:spring-boot-starter-*
![]() |
![]() |
todo:手写一个起步依赖:*-starter
六、外化配置加载顺序
Spring Boot 的外化配置加载顺序遵循特定的优先级规则,高优先级的配置会覆盖低优先级的。以下是详细的配置源加载顺序及规则:
一、配置源的优先级(从高到低)
-
命令行参数
通过--key=value
传递的参数,如java -jar app.jar --server.port=8081
。 -
SPRING_APPLICATION_JSON
属性
通过环境变量或系统属性传递的 JSON 格式配置,如SPRING_APPLICATION_JSON='{"server":{"port":8081}}'
。 -
Java 系统属性
使用-D
参数设置的属性,如-Dserver.port=8081
。 -
操作系统环境变量
如SERVER_PORT=8081
。 -
Profile-Specific 配置文件(外部)
位于项目外部的application-{profile}.properties
或 YAML 文件(如./config/application-dev.yml
)。 -
Profile-Specific 配置文件(内部)
位于项目内部的application-{profile}.properties
或 YAML 文件(如classpath:/application-dev.yml
)。 -
常规配置文件(外部)
项目外部的application.properties
或 YAML 文件(如./config/application.yml
)。 -
常规配置文件(内部)
项目内部的application.properties
或 YAML 文件(如classpath:/application.yml
)。 -
@PropertySource
注解
通过@PropertySource
加载的配置文件。 -
默认属性
通过SpringApplication.setDefaultProperties()
设置的默认属性。
二、配置文件的位置优先级
Spring Boot 会从以下位置按顺序加载配置文件(优先级从高到低):
-
当前目录的
/config
子目录
file:./config/
-
当前目录
file:./
-
Classpath 的
/config
包
classpath:/config/
-
Classpath 根目录
classpath:/
同一位置的加载顺序:
先加载
application.properties
,再加载application.yml
。若激活了 Profile(如
dev
),则加载application-{profile}.properties
或yml
,覆盖默认配置。
三、覆盖规则
-
高优先级位置 > 低优先级位置
例如,外部的file:./config/application.properties
会覆盖内部的classpath:/application.properties
。 -
同一位置下,Profile-Specific 配置 > 默认配置
例如,file:./config/application-dev.yml
会覆盖同位置的file:./config/application.yml
。 -
非配置文件源 > 配置文件源
如命令行参数、环境变量等优先级高于所有配置文件。
四、示例说明
假设以下配置存在:
-
命令行参数:
--server.port=8081
-
外部文件
./config/application.yml
:server.port: 8082
-
内部文件
classpath:/application-dev.yml
(激活dev
Profile):server.port: 8083
最终生效的端口为 8081
(命令行参数优先级最高)。
五、高级配置
-
自定义配置文件路径
通过--spring.config.location=classpath:/custom/
或spring.config.additional-location
指定额外路径。 -
多文档 YAML 文件
在单个 YAML 文件中使用---
分隔符定义不同 Profile 的配置(需 Spring Boot 2.4+)。
总结
Spring Boot 的配置加载顺序以“就近覆盖”为原则,同时支持灵活的外部化配置。理解这一机制有助于在不同环境(开发、测试、生产)中高效管理配置。
七、PropertySource
@PropertySource
是 Spring 框架提供的注解,用于向 Spring 的 Environment
中添加自定义的配置文件。它通常用于加载非默认的 application.properties
或 application.yml
文件,以扩展或覆盖默认配置。
一、@PropertySource
的作用
-
加载外部配置文件
显式指定自定义的配置文件(如custom.properties
),将配置注入到 Spring 环境中。 -
支持多环境配置
结合@Profile
注解,按需加载不同环境的配置。 -
模块化配置
将大型项目的配置拆分为多个文件,按模块加载。
二、基本用法
1. 加载单个配置文件
java
复制
@Configuration @PropertySource("classpath:config/custom.properties") public class AppConfig { }
2. 加载多个配置文件
java
复制
@Configuration @PropertySource({"classpath:config/db.properties", "classpath:config/redis.properties"}) public class AppConfig { }
三、典型用例说明
1. 加载自定义配置文件
假设有一个 custom.properties
:
properties
复制
app.name=MySpringBootApp app.version=1.0.0
在 Java 配置类中加载:
java
复制
@Configuration @PropertySource("classpath:custom.properties") public class AppConfig { @Autowired private Environment env; @Bean public MyAppInfo myAppInfo() { MyAppInfo info = new MyAppInfo(); info.setName(env.getProperty("app.name")); info.setVersion(env.getProperty("app.version")); return info; } }
2. 结合 @Profile
按环境加载
假设有 dev
和 prod
环境的配置:
-
config-dev.properties
-
config-prod.properties
通过 @Profile
按需激活:
java
复制
@Configuration @Profile("dev") @PropertySource("classpath:config-dev.properties") public class DevConfig { } @Configuration @Profile("prod") @PropertySource("classpath:config-prod.properties") public class ProdConfig { }
3. 加载外部路径的配置文件
从文件系统绝对路径加载:
java
复制
@Configuration @PropertySource("file:/etc/myapp/config.properties") public class ExternalConfig { }
4. 加载 YAML 文件(需自定义处理)
默认 @PropertySource
不支持 YAML,需借助 YamlPropertySourceFactory
:
java
复制
@Configuration @PropertySource( value = "classpath:config/custom.yml", factory = YamlPropertySourceFactory.class ) public class YamlConfig { }
自定义 YamlPropertySourceFactory
:
java
复制
public class YamlPropertySourceFactory implements PropertySourceFactory { @Override public PropertySource<?> createPropertySource(String name, EncodedResource resource) throws IOException { YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean(); factory.setResources(resource.getResource()); Properties properties = factory.getObject(); return new PropertiesPropertySource( (name != null ? name : resource.getResource().getFilename()), properties ); } }
四、覆盖规则与优先级
-
@PropertySource
加载的配置优先级低于命令行参数、环境变量等,但高于默认配置(application.properties
)。 -
覆盖顺序:后加载的配置会覆盖先加载的配置。例如:
java
复制
@PropertySource({"file:config1.properties", "file:config2.properties"})
config2.properties
中的值会覆盖config1.properties
。
五、注意事项
-
不支持 YAML 的默认加载
需要自定义PropertySourceFactory
才能加载 YAML 文件。 -
路径问题
-
classpath:
表示从类路径加载。 -
file:
表示从文件系统加载。
-
-
Profile 激活依赖
结合@Profile
使用时,需确保 Profile 已正确激活(如通过spring.profiles.active
)。 -
多模块配置冲突
避免多个模块加载同名属性导致意外覆盖。
六、总结
@PropertySource
的典型使用场景:
-
加载非标准名称的配置文件(如
custom.properties
)。 -
按模块或环境拆分配置。
-
集成遗留系统或第三方库的配置文件。
通过灵活使用 @PropertySource
,可以实现更清晰的配置管理和更高的代码可维护性。
八、Actuator
![]() |