单例范围
当 bean 是 singleton 时,只会管理 bean 的一个共享实例,并且所有对 id 或 id 与该 bean 定义匹配的 bean 的请求都将导致 Spring 返回一个特定的 bean 实例容器。
换句话说,当你定义一个bean定义并且它的作用域是singleton时,那么Spring IoC container将由那个bean定义定义create exactly one instance of the object。该单个实例将存储在此类单例 bean 的缓存中,并且对该命名 bean 的所有后续请求和引用都将导致返回缓存的对象。
会话范围
有了上面的 bean 定义,Spring 容器将为 lifetime of a single HTTP Session 创建一个全新的 bean 实例。
根据 Spring 框架参考,如果需要将“lives longer”(在这种情况下为单例 bean)的类注入另一个生命周期相对较短的类(会话-范围的bean)。不过,原型和单例范围的方法不同。
在您的 XML 中,我们想要的是 singletonBean 实例应该只实例化一次,并且应该使用 sessionBean 注入。但是由于sessionBean 是会话范围的(这意味着它应该为每个会话重新实例化),所以配置是不明确的(因为依赖项是在实例化时设置的,并且会话范围的值也可以在以后更改)。
因此,与其注入该类,不如注入一个代理,该代理公开与 sessionBean 完全相同的公共接口。容器将这个代理对象注入到 singletonBean 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>
当singletonBean 实例调用依赖注入的 sessionBean 对象上的方法时,它实际上是在调用代理上的方法。然后代理从(在这种情况下)HTTP Session 中获取真实的 sessionBean 对象,并将方法调用委托给检索到的真实 sessionBean 对象。
更多信息请参考this。
具有原型 bean 依赖关系的单例 bean
查找方法注入
当您使用 singleton-scoped bean 和 prototype beans 上的依赖项时,请注意在实例化时解决依赖项。因此,如果您将 prototype-scoped bean 依赖注入到单例 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>
Lookup method 注入是容器对override methods on container 托管bean 的能力,返回容器中另一个命名bean 的查找结果。 lookup 通常涉及prototype bean,如上一节所述的场景中。 Spring 框架通过使用来自CGLIB library 的字节码生成来动态生成覆盖该方法的子类来实现此方法注入。
请参考lookup method injection。
Follow 获取更详细的示例和信息。