簡體   English   中英

春豆執法范圍

[英]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的新實例,但是我總是返回相同的單例實例。 還有一種情況, aDependencybDependency可能在內部再次具有對其他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屬性useService1useService2不包含的不同實例xyzService 這就是聲明xyzService被限制為原型的效果。 如果你真的想要的新實例xyzService bean中的生命周期中可用useService豆,我認為你需要一個不同的方法-看看對於文檔方式注入

在您的示例中,每次您請求spring容器一個userService實例時,它將返回單例實例並注入xyzService的新實例。

但是,當spring創建xyzService的新實例時,它將使用aDependencybDependency的單例實例,除非另外將它們也定義為prototype

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM