使用@Value注入属性以抽象类

时间:2013-07-31 03:48:09

标签: spring

我有一个抽象类,我试图使用@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构造型,但仍然是相同的。

我可以通过这种方式将值注入抽象类吗?如果没有,怎么能做到这一点?

2 个答案:

答案 0 :(得分:18)

我认为你会发现sharedVal 正在设置,但是你在构造函数中过早地尝试使用它。在Spring使用@Value注释注入值之前调用构造函数(必须调用)。

不是在构造函数中处理值,而是尝试使用@PostContruct方法,例如:

@PostConstruct
void init() {
    //perform common action using sharedVal
 }

(或者,实现Spring的InitializingBean接口)。

答案 1 :(得分:5)

  

我可以这样将值注入抽象类吗?

抽象类无法实例化,因此无法将任何内容注入抽象类。相反,您应该将值注入其具体的子类。

确保您的具体子类标记为@Component构造型,并由Spring进行“组件扫描”。


更新:我终于弄清楚你是在尝试访问构造函数中注入的值,但发现该值未设置。这是因为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执行常规操作