[英]Scope of Spring beans enforcement
我有一個例子。
<bean id="xyzService" class="XyzServiceImpl" scope="prototype">
<property name="aDependency" ref="aDependency" />
<property name="bDependency" ref="bDependency" />
</bean>
<bean id="useService" class="UseServiceImpl">
<property name="xyzService" ref="xyzService"/>
</bean>
Java類:
public class XyzServiceImpl implements XyzService{
private ADependency aDependency= null;
private BDependency bDependency= null;
// getters and setters...
}
public class UseServiceImpl implements UseService {
private XyzService xyzService= null;
// getters and setters...
xyzService.doSomething();
}
現在,每次在UseServiceImpl中,我都希望有一個xyzService的新實例,但是我總是返回相同的單例實例。 還有一種情況, aDependency
和bDependency
可能在內部再次具有對其他bean的更多引用。
現在,我有一個問題,例如如何獲取xyzService的新實例。 難道我做錯了什么?
默認情況下,spring bean的作用域是singleton
,您需要標記作用域prototype
以指示spring
<bean id="beanId" class="some.class.Name" scope="prototype"/>
Spring將在Bean的每個請求上創建新實例
看到
我可以通過實現ApplicationContextAware
接口輕松找到解決方案,該接口具有用於上下文的getter和setter方法。 從上下文中,我可以說getBean並獲取新的實例
public class UseServiceImpl implements UseService,ApplicationContextAware {
private ApplicationContext context;
XyzService xyzService= context.getBean(XyzServiceImpl.class);
// getter and setter for applicationContext
private XyzService xyzService= null;
// getters and setters...
xyzService.doSomething();
}
如果您具有以下條件:
<bean id="xyzService" class="XyzServiceImpl" scope="prototype">
<property name="aDependency" ref="aDependency" />
<property name="bDependency" ref="bDependency" />
</bean>
<bean id="useService1" class="UseServiceImpl">
<property name="xyzService" ref="xyzService"/>
</bean>
<bean id="useService2" class="UseServiceImpl">
<property name="xyzService" ref="xyzService"/>
</bean>
然后,你應該能夠驗證xyzService
屬性useService1
和useService2
不包含的不同實例xyzService
。 這就是聲明xyzService
被限制為原型的效果。 如果你真的想要的新實例xyzService
bean中的生命周期中可用useService
豆,我認為你需要一個不同的方法-看看對於文檔方式注入 。
在您的示例中,每次您請求spring容器一個userService實例時,它將返回單例實例並注入xyzService的新實例。
但是,當spring創建xyzService的新實例時,它將使用aDependency和bDependency的單例實例,除非另外將它們也定義為prototype 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.