Spring构造器依赖注入中@Value注解的含义与作用解析
@Value注解作用及默认值问题解答
直接给结论:
- 构造器参数上的
@Value("For all my running, I can understand")作用很明确:告诉Spring容器,调用这个构造器创建Inspiration实例的时候,直接把注解里写的这个字符串传给lyric参数,最终赋值给类的lyric成员变量。 - 这个配置根本不是lyric参数的默认值,它是写死的注入值,只要Spring走这个构造器建Bean,lyric就会被设成这个字符串。你在类里给lyric写的初始值
"I can keep the door cracked open, to let light through"会被构造器的赋值直接覆盖,完全不会生效。
补充说明
@Value如果直接写普通字符串、不用${}读配置、不用#{}写SpEL表达式,传的就是固定字面量,没有什么兜底逻辑,就是明确要注入的值。- 真正的@Value默认值只有搭配配置占位符的时候才存在,写法是
@Value("${lyric.content:默认值内容}"):这种情况Spring会先找配置里lyric.content对应的值,只有找不到这个配置项的时候,才会用冒号后面的内容当兜底默认值。你现在的写法根本没用到占位符,和默认值逻辑完全不沾边。 - 你这个类只有一个带参构造器,Spring 4.3之后不用额外加
@Autowired,会自动选这个构造器注入,参数值直接取@Value里写的内容就行。
跑个测试就能验证:把这个Bean丢到Spring上下文里,调用
getLyric()拿到的结果永远是For all my running, I can understand,类里写的字段初始值根本没机会用到。
内容的提问来源于stack exchange,提问作者Sahil
相关产品推荐
相关产品推荐

