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

Java 如何在类型为接口的注入点中注入实现,java,spring,dependency-injection,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 = interfac

假设我有以下接口:

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
?另外,是否可以使用注释来执行此操作?

您只需像任何其他bean一样注入它,只要运行时类型兼容,就可以正常工作,不需要对XML中的接口类型执行任何特殊操作

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

@Autowired
也可以正常工作,当然,如果容器中有多个interface1实现,您需要使用
@Qualifier

  • 如果您使用xml,这无关紧要——您定义bean,并按bean名称(而不是类型)注入bean
  • 如果使用注释,use可以使用
    @Resource(name=“beanName”)
    @限定符

另一种选择是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配置找到您的 @配置注释类

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

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

有关详细信息,请参阅: