我有一个抽象类,我试图使用@Value注释从属性文件注入值
public abstract class Parent {
@Value ("${shared.val}")
private String sharedVal;
public Parent() {
//perform common action using sharedVal
}
}
@Component
public class ChildA extends Parent {
Param a1;
@Autowired
public ChildA (Param a1) {
super();
this.a1 = a1;
}
}
我收到NullPointerException,因为未设置sharedVal。我尝试在抽象类上添加@Component构造型,但仍然是相同的。
我可以通过这种方式将值注入抽象类吗?如果没有,怎么能做到这一点?
答案 0 :(得分:18)
我认为你会发现sharedVal 正在设置,但是你在构造函数中过早地尝试使用它。在Spring使用@Value
注释注入值之前调用构造函数(必须调用)。
不是在构造函数中处理值,而是尝试使用@PostContruct
方法,例如:
@PostConstruct
void init() {
//perform common action using sharedVal
}
(或者,实现Spring的InitializingBean接口)。
答案 1 :(得分:5)
我可以这样将值注入抽象类吗?
抽象类无法实例化,因此无法将任何内容注入抽象类。相反,您应该将值注入其具体的子类。
确保您的具体子类标记为@Component
构造型,并由Spring进行“组件扫描”。 1}}不需要抽象类,因为它无法实例化。
更新:我终于弄清楚你是在尝试访问构造函数中注入的值,但发现该值未设置。这是因为Spring将在实例化bean之后注入值。因此,如果未使用构造函数注入,则无法在构造函数内访问注入的值。您可以按照Matt的建议使用@Component
或实施@PostContruct
。
以下显示是否使用了XML配置:
InitializingBean
使用<context:property-placeholder location="classpath:xxxxx.properties" ignore-unresolvable="true" />
<bean id="parent" class="pkg.Parent" abstract="true" init-method="postConstruct">
<property name="sharedVal" value="${shared.val}" />
</bean>
<bean id="child" class="pkg.ChildA" parent="parent">
sharedVal
执行常规操作