Spring创建一个单例的多个实例?

我有一个自动相互连接的Spring bean图。大大简化了图示:

<context:annotation-config/>

<bean class="Foo"/>

<bean class="Bar"/>

<bean class="Baz"/>

...

public class Foo {

@Autowired Bar bar;

@Autowired Baz baz;

}

public class Bar {

@Autowired Foo foo;

}

public class Baz {

@Autowired Foo foo;

}

所有这些bean都没有指定范围,这暗示它们是单例(使它们成为显式单例不会改变任何东西,我已经尝试过)。

问题在于,在实例化 ,的实例BarBaz包含的 实例Foo。怎么会这样

我试图为它创建public no

args构造函数,Foo并且调试已确认Foo创建了多次。所有这些创建的堆栈跟踪都在这里。

我还尝试过为Spring启用调试日志记录,在所有其他行中,都得到了以下内容:

DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'Foo'

DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'Foo'

DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'Foo'

我知道我的bean相互交叉引用,但是我希望Spring框架尊重singleton范围并初始化一次singleton

bean,然后将其自动连接到任何需要它的人。

一个有趣的事实是,如果我将老式private构造函数与public static Foo getInstance访问器一起使用,则可以正常工作-

在上下文设置过程中不会引发异常。

FWIW,我在o.s.c.s.ClassPathXmlApplicationContext(String

...configLocations)构造器中使用Spring版本3.0.5(也尝试过3.1.2,结果相同)。

我可以轻松地将代码转换为使用静态初始值设定项,但我想了解为什么Spring会这样表现。这是一个错误吗?

一些其他调查显示

  • 初始化应用程序上下文后,所有后续请求context.getBean(Foo.class) 返回的相同实例Foo
  • @Autowired用setter 替换(此bean约有20种用法)仍然会导致该对象的多次构造,但是所有依赖项都注入 引用。

上面对我来说,这表明这是一个与@Autowired实现有关的Spring错误。我将发布到Spring社区论坛,并在这里发布任何有用的信息。

回答:

如果您不小心使用context:component-

scan注释(还有其他Spring上下文扫描注释,例如MVC和其他注释),则子上下文可以重新实例化相同的singleton

bean。在Web应用程序中使用Spring

servlet时,这是一个常见问题,请参见为什么DispatcherServlet创建另一个应用程序上下文?

确保您没有在子上下文中重新扫描组件,或者仅扫描特定的程序包/注释,并从根上下文组件扫描中排除所述程序包/注释。

以上是 Spring创建一个单例的多个实例? 的全部内容, 来源链接: utcz.com/qa/410901.html

回到顶部