2013-05-15 51 views
0

这里是从这里发布一些代码,这可以解释我的问题:弹簧3依赖注入和接口

接口:

package org.better.place 

public interface SuperDuperInterface{ 
    public void saveWorld(); 
} 

实现:

package org.better.place 

import org.springframework.stereotype 

public class SuperDuperClass implements SuperDuperInterface{ 
    public void saveWorld(){ 
      System.out.println("Done"); 
    } 
} 

客户:

package org.better.place 

import org.springframework.beans.factory.annotation.Autowire; 

public class SuperDuperService{ 

     private SuperDuperInterface superDuper; 

     public void doIt(){ 
      superDuper.saveWorld(); 
     } 

     public void setSuperDuper(SuperDuperInterface superDuper) { 
     this.superDuper = superDuper; 
     } 
} 

我的问题是 - 我如何在spring配置中配置bean?我不想使用@Autowired和其他注释。

我想这会是这样的:

<bean id="superService" class="org.better.place.SuperDuperService"> 
    <property name="superDuper" ref="superWorker" 
</bean> 

<bean id="superWorker" class=?????? parent=???????? > 
</bean> 

回答

1

你必须实例化实现类,当然:

<bean id="superWorker" class="org.better.place.SuperDuperClass"/> 

,如果你想你只需要parent属性创建具有不想重复声明的公共属性的多个bean,以便将其移动到具体bean定义可引用的抽象父bean定义。
假设SuperDuperClass具有一些性质:

<bean id="superWorkerPrototype" abstract="true" 
     class="org.better.place.SuperDuperClass"> 
    <property name="prop1" value="value1"/> 
    <property name="prop2" value="value2"/> 
</bean> 

<bean id="superWorker1" parent="superWorkerPrototype" 
     class="org.better.place.SuperDuperClass"> 
    <property name="prop3" value="foo"/> 
</bean> 

<bean id="superWorker2" parent="superWorkerPrototype" 
     class="org.better.place.SuperDuperClass"> 
    <property name="prop3" value="bar"/> 
</bean> 

它将导致在具有用于prop1prop2相同的值,但不同者两个实例为prop3

0

您可以给实施类的完全限定名称,并且不要求给出parent属性。 Spring会自动查找,如果它可以的SuperDuperClass实例分配到的SuperDuperService

<bean id="superWorker" class="org.better.place.SuperDuperClass" > 
</bean> 
+0

superDuper场我看不出有什么可以让Spring自动注入'SuperDuperClass'实例的'SuperDuperService'不使用'@Autowired '在里面(OP想要避免)。 – zagyi

+0

,除非你明确地说@Autowired或在xml spring中提到auto-wire不自动连线。我在这里试图解释的是避免父标签,因为spring会发现它是否可以分配实例 – sanbhat

+0

是的,这就是我的意思。它们都不在问题的代码片段中,所以不明白为什么你写了这样的话:“Spring会自动查找它是否可以将SuperDuperClass的实例分配给SuperDuperService的superDuper字段” – zagyi