为什么在Spring Boot中无法读取application.properties配置文件的属性?
问题原因
- 核心原因:Spring的
@Value注解不支持直接注入静态类属性。Spring依赖注入基于实例对象完成,static修饰的属性属于类层级,不属于实例属性,因此不会被自动注入,默认值就是null。 - 额外排查点:你写的配置文件名是
application.peoprerties,存在拼写错误,正确的文件名应为application.properties,文件名错误会导致Spring无法读取配置项。 - 包扫描验证:你的启动类
NewsSiteApplication在site包下,PostDao在site.model子包下,@SpringBootApplication默认扫描当前包及所有子包的组件,包扫描逻辑没有问题。
注意:无论用哪种方案,都必须通过Spring容器获取PostDao实例,不要自行
new PostDao()对象,自行实例化的对象不会触发Spring的属性注入逻辑。
解决方案
方案1:去掉static修饰(最简便)
如果业务场景不需要用静态变量访问这几个配置,直接删除static修饰符即可:
@Component public class PostDao { @Value("${url}") public String DATABASE_URL; @Value("${user}") public String USER; @Value("${password}") public String PASSWORD; }
使用的时候通过Spring注入的PostDao实例访问属性,不要直接用类名调用。
方案2:通过setter方法注入静态变量(需要保留static的场景)
把@Value注解加在非静态的setter方法上,在方法内给静态变量赋值:
@Component public class PostDao { public static String DATABASE_URL; public static String USER; public static String PASSWORD; @Value("${url}") public void setDatabaseUrl(String url) { DATABASE_URL = url; } @Value("${user}") public void setUser(String user) { USER = user; } @Value("${password}") public void setPassword(String password) { PASSWORD = password; } }
方案3:通过@PostConstruct初始化静态变量
先把配置注入到实例属性,Bean初始化完成后赋值给静态变量:
@Component public class PostDao { public static String DATABASE_URL; public static String USER; public static String PASSWORD; @Value("${url}") private String databaseUrl; @Value("${user}") private String user; @Value("${password}") private String password; @PostConstruct public void initStaticConfig() { DATABASE_URL = this.databaseUrl; USER = this.user; PASSWORD = this.password; } }
内容的提问来源于stack exchange,提问作者Denys_newbie
相关产品推荐
相关产品推荐

