如何在任何其他类构造函数调用之前调用Spring setter方法?

时间:2012-08-10 08:42:07

标签: java spring dependency-injection

我有一个动作类,该类将有一个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

3 个答案:

答案 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或构造函数)。