繁体   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