使用@Value注入application.properties值失败,注入结果为属性名,求排查
问题排查与修复方案
Hey,我来帮你搞定这个@Value注入的问题——你现在运行代码后输出的是${set.browser}而不是配置文件里的ie,对吧?核心问题有这几个:
1. Spring上下文加载的类错了
你的启动类AMain里初始化上下文时传的是A.class,但A根本不是Spring的配置类啊!这就导致Spring完全不知道ABean里定义的Bean,更没法处理属性注入的逻辑了。
2. 没告诉Spring要加载application.properties
这是纯Spring框架(不是Spring Boot),默认不会自动加载application.properties,得手动用@PropertySource注解指定加载这个文件,不然Spring根本不知道有这个配置存在。
3. (可选优化)直接new对象的小细节
虽然你在ABean里用@Bean返回new A(),Spring理论上会对这个实例做注入,但如果A没被Spring标记为需要处理的类,偶尔也会有问题(不过这个不是这次的核心锅,前两点才是关键)。
修复后的完整代码
先改配置类ABean,加上加载配置文件的注解
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.PropertySource; @Configuration @PropertySource("classpath:application.properties") // 告诉Spring加载类路径下的配置文件 public class ABean { @Bean public A getA(){ return new A(); } }
再改启动类AMain,加载正确的配置类
import org.springframework.context.annotation.AnnotationConfigApplicationContext; public class AMain { public static void main(String[] args) { // 这里要传配置类ABean.class,不是A.class! AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ABean.class); A a = context.getBean(A.class); a.print(); context.close(); // 用完记得关上下文哦 } }
(另一种写法)用@Component替代@Bean方法
如果你不想写ABean里的@Bean方法,也可以直接给A类加@Component注解,然后让Spring自动扫描:
import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; @Component public class A { @Value("${set.browser}") private String browser; public A(){} public void print(){ System.out.println(browser); } }
然后修改ABean,开启组件扫描:
import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.PropertySource; @Configuration @PropertySource("classpath:application.properties") @ComponentScan(basePackages = "com.your.package") // 替换成你的A类所在的包路径 public class ABean { }
启动类还是加载ABean.class就行。
为啥这样改就好了?
@PropertySource相当于给Spring指了路:“去加载这个配置文件”,这样Spring才能把${set.browser}解析成实际的ie。- 启动上下文加载
ABean后,Spring才能识别到Bean的定义和配置文件,进而完成@Value的注入工作。 - 只有当
A的实例被Spring托管(不管是@Bean还是@Component),Spring才会在创建实例后处理@Value注解,把配置值塞进browser字段里。
内容的提问来源于stack exchange,提问作者Ron.Peled
相关产品推荐
相关产品推荐

