Spring是否支持在父类上使用@Value注解?附代码验证疑问
Spring @Value注解在父类的生效与继承问题
一、@Value是否支持在父类中生效?
Spring的@Value注解支持在父类中生效,只要子类是Spring容器管理的Bean(例如标注了@Component、@Service、@Controller等注解)。
Spring的依赖注入处理器在处理Bean时,会递归扫描当前Bean类的所有父类,查找带有@Value的字段/方法,即使父类的字段是private修饰符,Spring也能通过反射机制完成注入。
二、你提供的代码是否会输出“hello world”?
不会,核心原因是:
- 代码中的
Base和MyClass都没有被标记为Spring容器的Bean,Spring不会自动实例化这个类,@PostConstruct注解修饰的init()方法根本不会被执行,自然不会有任何输出。
如果给MyClass加上@Component注解(确保它被Spring扫描并实例化),那么代码会输出“hello world”:
- Spring会注入父类
Base的someProperty(使用默认值hello,因为app.some.property未配置); - 同时注入子类
MyClass的otherProperty(使用默认值world); @PostConstruct方法执行后,会打印拼接后的字符串。
补充注意事项
- 如果父类的字段是
private但出现注入失败的极端情况(比如自定义BeanPostProcessor限制了反射访问),可以将字段改为protected,或者提供setter方法并在方法上标注@Value,注入会更稳妥。 - 若父类本身是Spring Bean(标注了Bean注解),父类的
@Value会独立生效,子类继承时会复用父类的字段值(除非子类重写了对应字段)。
内容的提问来源于stack exchange,提问作者ciis0
相关产品推荐
相关产品推荐

