单例模式
当一个bean被定义为singleton
时,Spring容器将只管理一个共享实例,并且对于与该bean定义匹配的id或ids的所有bean请求都将返回该特定的bean实例。
换句话说,当您定义一个bean定义并将其作用域设置为singleton
时,Spring IoC容器将创建该bean定义定义的对象的唯一实例
。这个单一实例将存储在这样的单例bean缓存中,并且所有后续请求和引用该命名bean都将导致返回缓存对象。
会话模式
如上所述的bean定义放置在适当的位置后,Spring容器将创建一个全新的bean实例,仅在单个HTTP会话的生命周期中
。
根据Spring框架参考文档,在类的“寿命更长
”(在本例中为singleton bean)需要注入具有相对较短寿命(session-scoped bean)的另一个类的情况下,需要采用不同的方法。对于原型和单例范围,方法是不同的。
在XML中,我们希望singletonBean实例仅被实例化一次,并使用sessionBean进行注入。但是,由于sessionBean
是会话范围的(这意味着它应该在每个会话中重新实例化),因此配置是有歧义的(因为依赖项在实例化时设置,而会话作用域的值可以稍后更改)。
因此,不是使用该类进行注入,而是使用公开与sessionBean完全相同的公共接口的代理进行注入。容器将此代理对象注入singletonBean bean中,该bean不知道此sessionBean引用是代理。可以通过编写sessionBean中的此标记来指定它:
<aop:scoped-proxy/>
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>
当一个单例bean实例调用依赖注入的sessionBean对象上的方法时,它实际上是在代理上调用方法。然后代理从(在本例中)HTTP会话中获取真实的sessionBean对象,并将方法调用委派到检索到的真实sessionBean对象。
此外,请参阅
此处以获取更多信息。
具有原型bean依赖项的单例bean
查找方法注入
当您使用依赖于原型bean的单例作用域bean时,请注意依赖关系在实例化时间解析。因此,如果您将一个prototype bean作为依赖注入到singleton作用域bean中,则会实例化一个新的prototype bean,然后将其依赖注入到singleton bean中。该原型实例是唯一提供给singleton作用域bean的实例。
但是,假设您希望singleton作用域bean在运行时重复获取原型作用域bean的新实例。您不能将原型作用域bean注入到singleton bean中,因为这个注入只发生一次,当Spring容器实例化singleton bean并解析和注入其依赖关系时。
<!
<bean id="command" class="fiona.apple.AsyncCommand" scope="prototype">
<!
</bean>
<!
<bean id="commandManager" class="fiona.apple.CommandManager">
<lookup-method name="createCommand" bean="command"/>
</bean>
Lookup method
注入是容器覆盖容器管理的Bean上的方法,以返回容器中另一个命名Bean的查找结果的能力。在前面的部分所述的场景中,lookup
通常涉及原型Bean。Spring框架通过使用来自CGLIB库的字节码生成动态生成子类来实现此方法注入,从而重写方法。
请参阅查找方法注入。
单击此处获取更详细的示例和信息。