【问题标题】:Spring 3 Dependency Injection and interfacesSpring 3 依赖注入和接口
【发布时间】:2013-05-15 14:27:35
【问题描述】:

这里有一些代码可以解释我的问题:

界面:

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>

【问题讨论】:

    标签: java spring configuration dependency-injection


    【解决方案1】:

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

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

    如果您想创建多个具有您不想重复声明的公共属性的 bean,则只需要 parent 属性,因此您将其移至具体 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 具有不同的值。

    【讨论】:

      【解决方案2】:

      您可以只给出实现类的完全限定名称,而不需要给出parent 属性。 Spring会自动查找是否可以将SuperDuperClass的实例分配给SuperDuperServicesuperDuper字段

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

      【讨论】:

      • 我看不出是什么让 Spring 自动将 SuperDuperClass 实例注入到 SuperDuperService 中而不使用 @Autowired(OP 希望避免这种情况)。
      • 除非你明确说 @Autowired 或在 xml spring 中提到 auto-wire 不会自动连接。我在这里试图解释的是避免父标签导致spring会找出它是否可以分配实例
      • 是的,我就是这个意思。他们都没有在问题的代码sn-p中,所以不明白你为什么写“Spring会自动查找它是否可以将SuperDuperClass的实例分配给SuperDuperService的superDuper字段”
      猜你喜欢
      • 2012-11-28
      • 2013-11-07
      • 2011-11-06
      • 1970-01-01
      • 2011-12-05
      • 2012-03-15
      • 2010-10-06
      • 2023-03-23
      • 2017-06-10
      相关资源
      最近更新 更多