2

我有一个动作类,该类将有一个 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首先调用它,但theBocsetter 仅在ActionCls构造函数之后调用。这是一种调用theBocsetter 1st然后只调用ActionCls构造函数的方法吗?所以这theBoc不是空的,我可以调用thefunc.

4

3 回答 3

6

您不能期望在调用其构造函数之前在类上调用 getter 或 setter。你想要达到的目标是不可能的。您可以更好地创建一个参数化构造函数,在其中使用一些参数初始化 theBoc,使用constuctor-argActionCls bean 上的参数,然后调用该方法:

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>
于 2012-08-10T08:46:21.400 回答
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

于 2012-08-10T09:18:21.310 回答
1

除了 baba 的回答,您可以使用init-method(or @PostConstruct) 来解决这个问题,但应该使用 onActionCls而不是 on BOC

public class ActionCls {
    ...
    public void init() {
       theBoc.thefunc();
    }
}

.

<bean ... class="com.huahsin68.ActionCls" init-method="init">...</bean>

我认为这种方法更优雅,因为 init 方法保证在 bean 完全初始化时执行,因此它不依赖于您用于依赖项的注入类型(setter 或构造函数)。

于 2012-08-10T09:07:27.817 回答