Spring:为什么我们自动装配接口而不是实现的类?

新手上路,请多包涵

例子

interface IA
{
  public void someFunction();
}

@Resource(name="b")
class B implements IA
{
  public void someFunction()
  {
    //busy code block
  }
  public void someBfunc()
  {
     //doing b things
  }
}

@Resource(name="c")
class C implements IA
{
  public void someFunction()
  {
    //busy code block
  }
  public void someCfunc()
  {
     //doing C things
  }
}

class MyRunner
{

  @Autowire
  @Qualifier("b")
  IA worker;

  worker.someFunction();
}

谁可以给我解释一下这个。

  • spring 如何知道要使用哪种多态类型。
  • 我需要 @Qualifier 还是 @Resource
  • 为什么我们自动装配接口而不是实现的类?

原文由 stackoverflow 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 657
2 个回答

spring 如何知道要使用哪种多态类型。

只要接口只有一个实现,并且该实现被注释为 @Component 并启用 Spring 的组件扫描,Spring 框架就可以找到(接口,实现)对。如果未启用组件扫描,则必须在 application-config.xml(或等效的 spring 配置文件)中明确定义 bean。

我需要@Qualifier 还是@Resource?

一旦你有多个实现,那么你需要对它们中的每一个进行限定,并且在自动装配期间,你需要使用 @Qualifier 注释来注入正确的实现,以及 @Autowired 注释。如果您使用@Resource(J2EE 语义),那么您应该使用此注释的 name 属性指定 bean 名称。

为什么我们自动装配接口而不是实现的类?

首先,通常对接口进行编码始终是一个好习惯。其次,对于 spring,您可以在运行时注入任何实现。一个典型的用例是在测试阶段注入模拟实现。

 interface IA
{
  public void someFunction();
}

class B implements IA
{
  public void someFunction()
  {
    //busy code block
  }
  public void someBfunc()
  {
     //doing b things
  }
}

class C implements IA
{
  public void someFunction()
  {
    //busy code block
  }
  public void someCfunc()
  {
     //doing C things
  }
}

class MyRunner
{
     @Autowire
     @Qualifier("b")
     IA worker;

     ....
     worker.someFunction();
}

您的 bean 配置应如下所示:

 <bean id="b" class="B" />
<bean id="c" class="C" />
<bean id="runner" class="MyRunner" />

或者,如果您在存在这些组件的包上启用了组件扫描,那么您应该使用 @Component 来限定每个类,如下所示:

 interface IA
{
  public void someFunction();
}

@Component(value="b")
class B implements IA
{
  public void someFunction()
  {
    //busy code block
  }
  public void someBfunc()
  {
     //doing b things
  }
}

@Component(value="c")
class C implements IA
{
  public void someFunction()
  {
    //busy code block
  }
  public void someCfunc()
  {
     //doing C things
  }
}

@Component
class MyRunner
{
     @Autowire
     @Qualifier("b")
     IA worker;

     ....
     worker.someFunction();
}

然后 worker 中的 MyRunner 将被注入 B 类型的实例。

原文由 Vikdor 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题