为singleton bean创建了多少个引用会话bean/prototype bean的实例

use*_*232 26 spring instance

我怀疑使用Spring时将在下面提到的场景中创建的实例数量:

bean配置是这样的

  <bean id="a" class="A">
    <property name="b" ref="b"/>
    </bean>

<bean id="b" class="B" scope="session"/> or

 <bean id="b" class="B" scope="prototype"/>
Run Code Online (Sandbox Code Playgroud)

默认情况下,bean"a"具有singleton scope.因此,有一个单例bean,它引用了一个具有会话范围或原型范围的bean.

在这种情况下,如果同时有2个应用程序请求,那么将创建多少个A实例以及将创建多少个B实例?

如果有人可以解释这是如何工作的,那将会有很大的帮助吗?

谢谢,Divya

Ank*_*hal 37

单身范围

当bean是a时singleton,将只管理bean的一个共享实例,并且对具有与该bean定义匹配的id或id的bean的所有请求将导致Spring容器返回一个特定的bean实例.

换句话说,当你定义一个bean定义并且它的作用域为a时singleton,那个bean定义Spring IoC containercreate exactly one instance of the object定义它.此单个实例将存储在此类单例bean的缓存中,并且该命名Bean的所有后续请求和引用将导致返回缓存的对象.

会话范围

有了上面的bean定义,Spring容器将创建一个全新的bean实例lifetime of a single HTTP Session.

根据Spring框架引用,lives longer在需要使用具有相对较短寿命的另一个类(会话范围的bean)注入" "(在这种情况下为单例bean)的类的情况下,需要遵循不同的方法.尽管原型和单例范围的方法不同.

在您的XML中,我们想要的是singletonBean实例只应实例化一次,并且应该使用sessionBean注入.但由于sessionBean是会话范围的(这意味着它应该为每个会话重新实例化),配置是不明确的(因为依赖关系是在实例化时设置的,会话范围的值也可以在以后更改).

因此,它不是注入该类,而是注入一个代理,该代理公开与sessionBean完全相同的公共接口.容器将此代理对象注入singletonBean bean,该bean不知道此sessionBean引用是代理.它通过在sessionBean中写入此标记来指定:

<aop:scoped-proxy/>
Run Code Online (Sandbox Code Playgroud)

XML配置:

<bean name="singletonBean" class="somepkg.SingletonBean">
<property name="someProperty" ref="sessionBean"/>
</bean>

<bean name="sessionBean" class="somepkg.SessionBean" scope="session">
<aop:scoped-proxy/>
</bean>
Run Code Online (Sandbox Code Playgroud)

singletonBean实例在依赖注入的sessionBean对象上调用方法时,它实际上是在代理上调用方法.然后,代理从(在这种情况下)HTTP会话中获取真实的sessionBean对象,并将方法调用委托给检索到的真实sessionBean对象.

另请参阅信息以获取更多信息.

具有原型bean依赖关系的单例bean

查找方法注入

当您使用singleton-scoped具有依赖项的bean时prototype beans,请注意在实例化时解析依赖项.因此,如果依赖项将prototype-scopedbean注入到单例范围的bean中,则会实例化一个新的原型bean,然后将依赖注入到单例bean中.原型实例是唯一提供给单例范围bean的实例.

但是,假设您希望单例范围的bean在运行时重复获取原型范围的bean的新实例.您不能将原型范围的bean依赖注入到您的单例bean中,因为当Spring容器实例化单例bean并解析和注入其依赖项时,该注入只发生一次.

<!-- a stateful bean deployed as a prototype (non-singleton) -->
<bean id="command" class="fiona.apple.AsyncCommand" scope="prototype">
  <!-- inject dependencies here as required -->
</bean>

<!-- commandProcessor uses statefulCommandHelper -->
<bean id="commandManager" class="fiona.apple.CommandManager">
  <lookup-method name="createCommand" bean="command"/>
</bean>
Run Code Online (Sandbox Code Playgroud)

Lookup methodinject是容器对override methods on container托管bean 的能力,用于返回容器中另一个命名bean的查找结果.在lookup通常涉及prototype bean如在上一节中描述的方案.Spring Framework通过使用字节码生成来实现此方法注入,CGLIB library以动态生成覆盖该方法的子类.

参考查找方法注入.

请关注更详细的示例和信息.