在 Spring Boot 中,约定大于配置的核心是减少手动配置,但同时也允许开发者通过灵活的方式覆盖默认行为。修改配置的两种主要方式是 application.properties
(或 application.yml
推荐) 和 @Configuration
注解的配置类。它们的区别主要体现在 配置方式、灵活性、适用场景 和 优先级 上,下面详细对比:
一、两种配置方式的区别
维度 | application.properties /application.yml(推荐) | @Configuration 配置类 |
---|---|---|
配置形式 | 键值对(外部化配置) | Java 代码(编程式配置) |
适用场景 | 简单参数调整(如端口、数据库连接、开关功能) | 复杂逻辑配置(如自定义 Bean、条件化加载组件、覆盖自动配置类) |
灵活性 | 只能覆盖预定义的配置项 | 可完全自定义组件行为(如重写 DataSource 、拦截器等) |
优先级 | 更高(外部属性文件中的配置会覆盖代码中的默认值) | 较低(除非显式覆盖自动配置类) |
动态性 | 支持多环境配置(application-{profile}.properties ) | 可通过 @Profile 实现环境隔离 |
维护性 | 集中管理配置,适合运维人员修改 | 代码与配置结合,适合开发者维护 |
典型用例 | 修改服务器端口、数据源 URL、日志级别 | 自定义数据源、添加拦截器、整合第三方库 |
二、具体使用方式与示例
1. 通过 application.properties
修改配置
• 作用:覆盖 Spring Boot 的默认约定,调整预定义的配置参数。
• 特点:
• 无需编写代码,修改后重启生效(若需热更新需结合 @RefreshScope
等)。
• 配置项需符合 Spring Boot 的约定命名(如 server.port
、spring.datasource.url
)。
示例:修改服务器端口和数据库连接
# application.properties
server.port=9090 # 覆盖默认端口 8080
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=admin
spring.datasource.password=secret
2. 通过 @Configuration
类自定义配置
• 作用:完全自定义组件行为,或覆盖自动配置类,通过一些注解(Auto-Configuration)。
• 特点:
• 需要编写 Java 代码,适合复杂逻辑(如条件化创建 Bean)。
• 可结合 @Bean
、@Conditional
等注解实现精细控制。
示例:自定义数据源并禁用自动配置
@Configuration
public class DataSourceConfig {
@Bean
@ConfigurationProperties(prefix = "app.datasource") // 绑定自定义配置前缀
public DataSource customDataSource() {
return new HikariDataSource(); // 使用 HikariCP 连接池
}
}
在 application.properties
中配置自定义参数:
# application.properties
app.datasource.jdbc-url=jdbc:mysql://localhost:3306/mydb
app.datasource.username=admin
app.datasource.password=secret
三、优先级与覆盖规则
1. 配置优先级顺序
Spring Boot 的配置加载遵循以下优先级(从高到低):
- 命令行参数(如
--server.port=9000
) application.properties
/application.yml
@Configuration
类中的@Bean
定义- Spring Boot 自动配置(Auto-Configuration)
2. 如何覆盖自动配置?
• 通过属性文件:直接覆盖自动配置暴露的参数(如 server.port
)。
• 通过 @Configuration
类:
• 定义同名 Bean 来替换自动配置的 Bean(需禁用自动配置)。
• 使用 @ConditionalOnMissingBean
确保仅在无自定义 Bean 时启用自动配置。
示例:禁用 Spring Security 自动配置
# application.properties
spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration
四、适用场景与最佳实践
1. 使用 application.properties
的场景
• 简单参数调整:如端口、超时时间、日志级别。
• 环境差异化配置:通过 application-{profile}.properties
区分开发、测试、生产环境。
• 开关功能:启用或禁用某些模块(如 spring.main.web-application-type=none
)。
2. 使用 @Configuration
类的场景
• 自定义组件:如数据源、线程池、拦截器。
• 整合第三方库:如手动配置 MyBatis 的 SqlSessionFactory
。
• 覆盖自动配置:当默认行为不满足需求时(如更换 JSON 序列化库)。
3. 最佳实践
• 优先使用属性文件:保持配置集中化,便于维护。
• 复杂逻辑用代码配置:当需要编程逻辑(如条件分支)时,选择 @Configuration
。
• 避免重复配置:若属性文件已提供参数,无需在代码中硬编码。
五、总结
• application.properties
:适合简单、静态的配置调整,遵循约定命名,无需编码。
• @Configuration
类:适合动态、复杂的逻辑配置,通过代码实现完全控制。
• 二者协作:属性文件用于参数化,配置类用于定制化,共同实现灵活性与简洁性的平衡。
理解这两种方式的关系,能帮助你在 Spring Boot 项目中高效管理配置,既享受“约定大于配置”的便利,又能应对复杂需求。