我有一个动作类,该类将有一个BOC对象,它将填充Spring Dependency Injection。下面显示了示例代码:
public class ActionCls {
private BOC theBoc = null;
/*** theBoc getter / setter ***/
}
如果我想在thefunc
构造函数中调用属于BOC
的成员函数,请说ActionCls
,如下所示:
public class ActionCls {
private BOC theBoc = null;
ActionCls() {
theBoc.thefunc();
}
}
将抛出运行时错误,指出theBoc
为空。我确实尝试在弹簧配置中使用init-method
,如下所示:
<bean id="theBoc" class="com.huahsin68.BOC" init-method="thefunc"></bean>
无论如何这没有帮助,因为即使首先调用thefunc
,但theBoc
setter仅在ActionCls
构造函数之后调用。这是一种调用theBoc
setter 1st然后只调用ActionCls
构造函数的方法吗?因此theBoc
不为空,我可以调用thefunc
。
答案 0 :(得分:6)
在调用构造函数之前,不能指望在类上调用getter或setter。你想要实现的目标是不可能的。你可以更好地创建一个参数化的构造函数,在其中使用ActionCls bean上的constuctor-arg
参数,使用一些参数初始化theBoc,然后调用方法:
public class ActionCls {
private BOC theBoc = null;
ActionCls(BOC theBoc) {
this.theBoc = theBoc
theBoc.thefunc();
}
}
然后你可以像这样定义构造函数arg:
<bean id="actionCls" class="foo.bar.ActionCls">
<constructor-arg ref="boc"/>
</bean>
答案 1 :(得分:2)
虽然你不能做你要求的(在构造函数中调用属性上的方法,而属性是通过mutator设置的),你可以使用@PostConstruct
来调用Spring来调用一旦你的bean正确组装就可以了。
class ActionCls {
@Inject
private BOC boc;
@PostConstruct
public void postConstruct() {
boc.func();
}
}
请参阅http://docs.oracle.com/javaee/5/api/javax/annotation/PostConstruct.html
答案 2 :(得分:1)
除了baba的回答之外,您还可以使用init-method
(或@PostConstruct
)来解决此问题,但应该在ActionCls
而不是BOC
上使用它:
public class ActionCls {
...
public void init() {
theBoc.thefunc();
}
}
<bean ... class="com.huahsin68.ActionCls" init-method="init">...</bean>
我认为这种方法更优雅,因为保证在bean完全初始化时执行init方法,因此它不依赖于您用于依赖项的注入类型(setter或构造函数)。