2010-05-12 111 views

回答

8

这不是真的,原型范围的豆是而不是在启动时初始化,除非其他的东西有对它们的引用。

如果您发现发生了这种情况,那么您必须具有从singleton bean到原型bean的引用,并且singleton bean的初始化正在触发创建原型。

+0

没有。我有一个从原型到单身的参考。所以singleton是原型的一个属性。虽然这两个都已初始化,但单身人士应该是这样,我看不出有任何需要立即初始化原型。它仍然发生。 – EugeneP 2010-05-12 13:45:34

+0

2个想法...使用eclipse spring插件获取bean依赖关系的映射,以便您可以查看它是否由另一个单例依赖,还可以在原型bean的构造函数中放置一个断点,以便您可以查看在什么导致其实例化。 – 2010-05-12 13:50:29

+2

@EugeneP:你正在做*某事*触发原型的初始化。我告诉你,Spring不会在启动时自动初始化原型。 – skaffman 2010-05-12 13:58:00

2

正如Skaffman在他的post中所述,原型bean在启动时未初始化。

即使这个配置了lazy-init的原型bean设置为false,也不会在执行ApplicationContext.getBean(..)方法之前创建。

<bean id="demo" class="demo.Demo" scope="prototype" lazy-init="false"> 

这只是添加调试日志消息到你的bean的构造函数或启动你的调试器,然后你会自己看到它。

如果您收到您的bean原型是这样的:

Demo demo = context.getBean("demo", Demo.class); 

然后,它是绝对没有机会,它在容器启动时初始化。

如果你仍然急于用原型范围初始化bean,我建议你展示与Spring容器和Spring配置交互的代码。

一种情形,当容器启动时(只要你的bean没有与lazy-init="true"配置)bean原型将被初始化:

SingletonBean singletonBean = context.getBean(SingletonBean.class); 
Demo demo = singletonBean.getDemo(); 

如果一个singleton bean有一个bean原型的依赖,该原型bean将与singleton bean一起初始化。

通过singletonBean检索演示对象的另一个副作用是,无论您执行context.getBean(SingletonBean.class);方法的次数多少,您都只有一个演示对象。