- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我对下面提到的场景中使用Spring Framework时会创建的实例数量有疑问:
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"/>
singleton scope
.所以有一个单例 bean 引用具有 session 范围或原型(prototype)范围的 bean。
最佳答案
单例范围
当 bean 是 singleton
,将只管理 bean 的一个共享实例,并且所有对具有与该 bean 定义匹配的 id 或 ids 的 bean 的请求将导致 Spring 容器返回该特定 bean 实例。
换句话说,当你定义一个 bean 定义并且它的作用域为 singleton
时。 ,然后是 Spring IoC container
将 create exactly one instance of the object
由那个 bean 定义定义。该单个实例将存储在此类单例 bean 的缓存中,并且对该命名 bean 的所有后续请求和引用都将导致返回缓存对象。
session 范围
有了上面的 bean 定义,Spring 容器将为 lifetime of a single HTTP Session
创建一个全新的 bean 实例。 .
根据 Spring 框架引用,在需要将“lives longer
”(在这种情况下是单例 bean)中的另一个类注入(inject)另一个具有相对较短生命周期的类( session 作用域 bean)的情况下,需要遵循不同的方法)。但是,原型(prototype)和单例范围的方法不同。
在您的 XML 中,我们想要的是 singletonBean 实例应该只实例化一次,并且应该注入(inject) sessionBean。但由于 sessionBean
是 session 范围的(这意味着它应该为每个 session 重新实例化),配置不明确(因为依赖项是在实例化时设置的, session 范围的值也可以稍后更改)。
因此,它不是注入(inject)该类,而是注入(inject)一个代理,该代理公开与 sessionBean 完全相同的公共(public)接口(interface)。容器将这个代理对象注入(inject)到 singletonBean bean 中,它不知道这个 sessionBean 引用是一个代理。它通过在 sessionBean 中写入此标记来指定:
<aop:scoped-proxy/>
<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
实例调用依赖注入(inject)的 sessionBean 对象上的方法,它实际上是调用代理上的方法。然后代理从(在本例中)HTTP Session 获取真正的 sessionBean 对象,并将方法调用委托(delegate)给检索到的真实 sessionBean 对象。
singleton-scoped
依赖于
prototype beans
的 bean ,请注意依赖项在实例化时解决。因此,如果你依赖注入(inject)一个
prototype-scoped
bean 转换为单例范围的 bean,实例化一个新的原型(prototype) bean,然后将依赖注入(inject)到单例 bean 中。原型(prototype)实例是唯一提供给单例作用域 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
注入(inject)是容器的能力
override methods on container
托管 bean,返回容器中另一个命名 bean 的查找结果。
lookup
通常涉及
prototype bean
如上一节所述的场景。 Spring 框架通过使用来自
CGLIB library
的字节码生成来实现此方法注入(inject)。动态生成覆盖该方法的子类。
关于spring - 为引用 session bean/原型(prototype) bean 的单例 bean 创建了多少个实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25000406/
我最近购买了《C 编程语言》并尝试了 Ex 1-8这是代码 #include #include #include /* * */ int main() { int nl,nt,nb;
早上好!我有一个变量“var”,可能为 0。我检查该变量是否为空,如果不是,我将该变量保存在 php session 中,然后调用另一个页面。在这个新页面中,我检查我创建的 session 是否为空,
我正在努力完成 Learn Python the Hard Way ex.25,但我无法理解某些事情。这是脚本: def break_words(stuff): """this functio
我是一名优秀的程序员,十分优秀!