2

我有这样的课-

class Messages
  {
      ...
      LinkedList<String> inputs;
      LinkedList<String> outputs;
      ...
  }

通常,我会在构造函数中初始化输入和输出 -

public Messages()
 {
    inputs = new LinkedList<String>();
    outputs = new LinkedList<String>();
 }

但是,我想使用 spring 配置来实现相同的结果。那么我应该在以下节点下放置什么?

<bean id="Messages" class="com.somename.Messages">
                                                   <--- what goes here?
</bean>

当 Spring Container 创建“Messages”bean 时,它还会调用构造函数吗?

4

4 回答 4

3

是的,它会调用构造函数。IoC 容器不调用构造函数会很奇怪——它必须花费一些时间来构造对象的实例而不通过构造函数,而且这几乎总是一个坏主意。

当然,您也可以将变量初始化为声明的一部分:

class Messages
{
    ...
    private final LinkedList<String> inputs = new LinkedList<String>();
    private final LinkedList<String> outputs = new LinkedList<String>();
    ...
}
于 2012-06-13T18:52:41.627 回答
0

Spring 将调用构造函数。如果有的话,它也会匹配构造函数参数。

这里详细解释http://static.springsource.org/spring/docs/2.5.x/reference/beans.html#beans-factory-collaborators

于 2012-06-13T18:52:22.670 回答
0

如果您只想在没有任何数据的情况下进行初始化,那么您可以在构造函数中执行此操作,因为将调用对象创建构造函数。如果您想分配特定数据,那么您的类中应该有设置器,并且需要在创建 bean 时使用它们。

于 2012-06-13T18:55:17.420 回答
0

我认为值得一提的是,代理对象的行为可能非常棘手。

Spring 在创建代理方面非常复杂。例如,从 Spring 3.2 开始,CGLIB 被重新封装在下面org.springframework,它会至少调用一次构造函数来创建代理。

当我们谈论 AOP 时,似乎不止一次

同时,从 Spring 4.0 开始,您的代理对象的构造函数将不再被调用两次,因为 CGLIB 代理实例将通过 Objenesis 创建。

Objenesis 是一个小型库,用于在不调用构造函数的情况下实例化对象。

所以,没有简单的是或否的答案。当然,无论框架如何,都会在某个时候调用构造函数来实例化对象。但是在现代框架中,有一些技巧可以帮助将构造函数调用的数量减少到最低限度。

于 2018-03-27T16:09:22.683 回答