如何在类型为接口的注入点中注入实现

时间:2012-07-03 18:39:09

标签: java spring dependency-injection

假设我有以下界面:

public interface Interface1 {
}

以及以下课程:

public class Class1 implements Interface1 {}

另外,我有这个课程:

public class Class2 {
    private Interface1 interface;
    public void setInterface(Interface1 interface) {
        this.interface = interface;
    }
}

我应该在applicationContext.xml中将Class1生成的bean注入Class2.interface?此外,是否可以使用注释进行操作?

3 个答案:

答案 0 :(得分:1)

您只需像其他任何bean一样注入它,只要Runtime类型兼容它就可以正常工作,不需要对XML中的接口类型做任何特殊处理。

<bean id="class1" class="package.Class1"/>
<bean id="class2" class="package.Class2">
  <property name="interface" ref="class1"/>
</bean>

@Autowired也可以正常工作,当然如果容器中有多个interface1实现,你需要用@Qualifier指定bean名称。

答案 1 :(得分:1)

  • 如果你使用xml就没关系 - 你定义你的bean并用bean名称注入bean(而不是键入)
  • 如果您使用注释,则可以使用@Resource(name="beanName")@Qualifier

答案 2 :(得分:0)

另一种选择是javaconfig:

package com.mycom.myapp.config;

@Configuration
public class MyConfiguration {
  @Bean
  public Class1 class1() {
    return new Class1();
  }

  @Bean
  public Class2 class2() {
    Class2 class2 = new Class2();
    class2.setInterface(class1());
  }
}

然后是另一小部分xml粘合代码,让xml配置找到你的 @Configuration带注释的类。

<context:component-scan base-package="com.mycom.myapp.config" />

当它看到@Configuration时,它会自动执行一些弹簧魔术,并使用该类构建您的bean,并使其可用于基于Xml的其余上下文,因此您可以根据需要进行混合和匹配。它足够聪明,可以处理bean范围,代理等等....即使你调用一个本地的方法(如上例中的“class1()”)也要感谢一些漂亮的javassist魔法。

有关详细信息,请参阅:http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/beans.html#beans-java