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都没有指定范围,这暗示它们是单例(使它们成为显式单例不会改变任何东西,我已经尝试过)。
问题在于,在实例化 ,的实例Bar
和Baz
包含的 实例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