Spring Boot新手求助:如何读取resources下的application.properties?
在Spring Boot中读取application.properties的正确姿势
嗨,作为Spring Boot新手,其实完全不用自己手动写FileReader那套原生IO代码啦!Spring Boot已经帮我们封装好了一套简洁高效的配置读取机制,我给你分享几种最常用的方案:
方法一:用@Value快速读取单个属性
这是读取少量零散属性最直接的方式:
- 确保你的
application.properties放在src/main/resources目录下(Spring Boot默认会自动加载这个文件),比如里面可以写:
app.name=MyFirstSpringApp app.version=1.0.0
- 在你的Spring组件(比如
@Service、@Controller、@Component或者@Configuration类)中直接注入属性:
import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; @Component public class SimpleConfigReader { // 用@Value绑定配置文件中的key,${}里写属性名 @Value("${app.name}") private String appName; @Value("${app.version}") private String appVersion; public void printAppInfo() { System.out.println("应用名称:" + appName); System.out.println("版本号:" + appVersion); } }
Spring会自动帮你完成属性注入,不用手动处理文件加载和IO操作~
方法二:用@ConfigurationProperties批量绑定属性
如果你的配置项比较多,或者属于同一组相关配置,用这种方式更清晰:
- 先在
application.properties中定义一组前缀相同的属性:
app.name=MyFirstSpringApp app.version=1.0.0 app.author=Albin app.max-connections=100
- 创建一个配置类,用
@ConfigurationProperties指定属性前缀,绑定所有相关属性:
import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; @Component @ConfigurationProperties(prefix = "app") // 指定属性的统一前缀 public class AppConfigProperties { // 属性名要和配置文件中去掉前缀后的部分一致(支持驼峰转下划线,比如maxConnections对应max-connections) private String name; private String version; private String author; private Integer maxConnections; // 必须生成getter和setter方法,Spring通过setter注入属性值 public String getName() { return name; } public void setName(String name) { this.name = name; } public String getVersion() { return version; } public void setVersion(String version) { this.version = version; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } public Integer getMaxConnections() { return maxConnections; } public void setMaxConnections(Integer maxConnections) { this.maxConnections = maxConnections; } }
- 在需要使用的地方注入这个配置类即可:
import org.springframework.stereotype.Service; @Service public class AppInfoService { private final AppConfigProperties appConfig; // 推荐用构造方法注入(比字段上的@Autowired更规范,也方便单元测试) public AppInfoService(AppConfigProperties appConfig) { this.appConfig = appConfig; } public void showFullAppInfo() { System.out.println("应用名称:" + appConfig.getName()); System.out.println("版本:" + appConfig.getVersion()); System.out.println("作者:" + appConfig.getAuthor()); System.out.println("最大连接数:" + appConfig.getMaxConnections()); } }
方法三:用Environment接口动态读取属性
如果需要动态获取属性,或者不确定属性是否存在,Environment接口会很实用:
import org.springframework.core.env.Environment; import org.springframework.stereotype.Component; @Component public class DynamicConfigReader { private final Environment environment; public DynamicConfigReader(Environment environment) { this.environment = environment; } public void readConfig() { // 直接通过key获取属性 String appName = environment.getProperty("app.name"); // 可以指定默认值,当属性不存在时就用默认值 String appDesc = environment.getProperty("app.desc", "这是一个Spring Boot应用"); System.out.println(appName + " - " + appDesc); } }
小提示
为什么不推荐你之前用的FileReader方式?因为Spring Boot的配置系统支持多环境配置(比如application-dev.properties、application-prod.properties)、命令行参数、环境变量等多种配置来源,手动读文件完全没法利用这些特性,还得自己处理文件路径、IO异常,太麻烦啦!
内容的提问来源于stack exchange,提问作者Albin Chandy
相关产品推荐
相关产品推荐

