0

在我的 XML 配置中,我有这个:

<bean id="soap" class="org.grocery.item.Soap" scope="prototype">
        <property name="price" value="20.00" />
</bean>

在我的服务类中,我有这样的“肥皂”自动接线:

@Autowired
private Soap soap;
//Accessor methods

我创建了一个这样的测试类:

Item soap = service.getItem(ITEM.SOAP);
Item soap2 = service.getItem(ITEM.SOAP);

if(soap2 == soap ){
    System.out.println("SAME REFERENCE");
}

这是我的服务类中的 getItem 方法:

public Item item(Item enumSelector) {
        switch (enumSelector) {
            case SOAP:
                return this.getSoap();
        }
        return null;
    }

@Autowired
private Soap soap;
//Accessor methods

现在我期待的是当我调用 this.getSoap(); 它将返回一个新的 Soap 对象。然而,它没有,即使肥皂被声明为原型。这是为什么?

4

2 回答 2

2

Renjith在他的回答中解释了原因。至于如何,我知道实现这一目标的两种方法:

  1. 查找方法:

不要将soap依赖声明为一个字段,而是作为一个抽象的getter方法:

protected abstract Soap getSoap();

每当您在服务中需要肥皂时(例如在 getItem 方法中),调用 getter。

在 xml 配置中,指示 Spring 为您实现该方法:

<bean id="service" class="foo.YourService">
  <lookup-method name="getSoap" bean="soapBeanId"/>
</bean>

每当调用时,Spring 提供的实现都会获取一个新的 Soap 实例。

  1. 范围代理

这指示 Spring 注入代理而不是真正的 Soap 实例。注入的代理方法将查找正确的soap实例(一个新的实例,因为它是一个原型bean)并委托给它们:

<bean id="soap" class="foo.Soap">
  <aop:scoped-proxy/>
</bean>
于 2013-02-20T10:51:17.813 回答
2

当您创建服务对象时,spring 会向您的服务对象注入一个soap 对象的实例。因此,所有对getSoap()服务的调用都将检索在创建服务时注入的同一个soap 对象。

于 2013-02-20T10:14:27.927 回答