Spring无法从application.properties获取值,求排查代码问题
问题原因与解决方案
核心原因
- 未加载配置文件:
AnnotationConfigApplicationContext仅默认加载注解配置类(如@Configuration标注的ConfigBeans),不会自动读取application.properties,导致Spring无法识别${my.prop}占位符,直接输出原始字符串。 - 缺少占位符解析器:即使手动加载了配置文件,纯Spring环境下需要显式配置
PropertySourcesPlaceholderConfigurer才能让@Value注解解析占位符(Spring Boot会自动配置此组件,但纯Spring上下文需要手动添加)。
修复方案
方案一:在纯Spring上下文环境中修复
修改ConfigBeans类,添加配置文件加载注解并配置占位符解析器:
@Configuration @PropertySource("classpath:application.properties") // 加载application.properties public class ConfigBeans { // 必须定义为static Bean,确保在其他Bean初始化前生效 @Bean public static PropertySourcesPlaceholderConfigurer placeholderConfigurer() { return new PropertySourcesPlaceholderConfigurer(); } @Bean public MyClass myClass() { return new MyClass(); } }
方案二:改用Spring Boot标准启动方式(推荐)
如果是Spring Boot项目,直接使用SpringApplication.run启动,它会自动完成配置文件加载和占位符解析:
@SpringBootApplication public class YourApplication { public static void main(String[] args) { ConfigurableApplicationContext context = SpringApplication.run(YourApplication.class, args); MyClass myBean = context.getBean(MyClass.class); myBean.printProp(); // 此时会输出testvalue } }
确认MyClass的注解使用正确
确保@Value注解的语法无误:
public class MyClass { @Value("${my.prop}") private String prop; public void printProp() { System.out.println(prop); } }
内容的提问来源于stack exchange,提问作者lm.
相关产品推荐
相关产品推荐

