Spring Boot如何使用自定义properties文件?替代application.properties
Hey,刚好对这块熟,我给你捋清楚怎么在Spring Boot里用自定义.properties,还能搞定排除默认属性的需求:
一、指定自定义.properties文件的常用方式
1. 用@PropertySource注解硬编码指定
直接在你的启动类或者配置类上加上这个注解,就能让Spring Boot加载你指定的配置文件:
@SpringBootApplication @PropertySource(value = "classpath:my-custom.properties") public class MyBootApplication { public static void main(String[] args) { SpringApplication.run(MyBootApplication.class, args); } }
如果有多个自定义文件,直接传数组就行:@PropertySource(value = {"classpath:db-config.properties", "classpath:redis-config.properties"})。要是文件不在项目的classpath里(比如服务器上的外部配置),可以用绝对路径:file:/opt/app-config/my-custom.properties。
2. 通过启动参数动态指定
不想把配置文件路径写死在代码里?启动Jar包的时候加参数就行:
# 只指定配置文件名称(默认找classpath下的my-custom.properties) java -jar my-app.jar --spring.config.name=my-custom # 指定完整路径,支持多个路径用逗号分隔 java -jar my-app.jar --spring.config.location=classpath:/my-custom.properties,file:/opt/config/extra.properties
用这个方式的话,Spring Boot会优先加载你指定的配置,不再默认加载application.properties(除非你特意把它加到spring.config.location里)。
二、排除默认application.properties的部分属性
如果你不想完全抛弃默认配置,只是想屏蔽其中某些属性,或者让自定义配置覆盖特定属性,有这几个思路:
1. 利用配置优先级自动覆盖
Spring Boot的配置是有优先级的:命令行参数 > 自定义配置文件 > application.properties。所以只要你在自定义文件里写和默认文件相同的key,自定义的属性值就会自动覆盖默认的。比如默认文件里有server.port=8080,你在自定义文件里写server.port=9090,启动后服务就会用9090端口。
2. 用@ConfigurationProperties限定绑定范围
如果只想让自定义配置类加载特定前缀的属性,完全不关心默认文件里的其他内容,可以这么做:
@Configuration @PropertySource("classpath:my-custom.properties") @ConfigurationProperties(prefix = "my.app") public class MyCustomConfig { private String appName; private int maxRequestCount; // 别忘了写getter和setter public String getAppName() { return appName; } public void setAppName(String appName) { this.appName = appName; } public int getMaxRequestCount() { return maxRequestCount; } public void setMaxRequestCount(int maxRequestCount) { this.maxRequestCount = maxRequestCount; } }
这样这个配置类只会绑定my.app开头的属性,默认application.properties里的其他属性根本不会影响它。
3. 排除特定自动配置类
如果是某些Spring Boot自动配置类用到了默认属性,你不想让这些配置生效,可以直接排除对应的自动配置类。比如不想用默认的数据源配置,就排除DataSourceAutoConfiguration:
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}) public class MyBootApplication { // ... }
这样默认的数据库相关属性(比如spring.datasource.*)就不会被加载和生效了。
三、几个关键注意点
- 如果你同时保留
application.properties和自定义文件,两者的不同key会自动合并,相同key则自定义文件的优先级更高。 - 要是想完全禁用默认的
application.properties,直接用启动参数--spring.config.name=你的自定义文件名就行,Spring Boot就只会加载你指定的文件。 @PropertySource加载的属性会和默认配置合并,所以如果要完全替换,优先用启动参数的方式更灵活。
内容的提问来源于stack exchange,提问作者Dullimeister




