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

堆栈溢出 :

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
  • 为什么我们要自动连接接口而不是实现的类?
维克多:

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();
}

然后workerMyRunner中将注入type的实例B

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么我们在实现派生接口的类上重新实现派生接口的父接口

为什么我们需要实现接口以提供某些功能,而不是仅定义方法而不实现接口?

为什么我们在实现功能接口时需要编写“实现接口名称”?

为什么我们使用()=> []而不是[]?

为什么我们要加密系统分区而不是/ home?

为什么我们不能在聚合中具体实现基接口?

为什么我们扩展JpaRepository接口而不实现它

为什么我们应该使用接口而不是具体类型?

为什么我们要降低扩展类中某个属性的可见性?

当我们有包装器类时,为什么要支持原语?

为什么我们可以将Java接口转换为* any *非最终类?

为什么我们可以对类本身进行操作,但又需要接口呢?

add(List <?extended Z>),其中Z是接口。类B扩展了A的实现Z为什么我们不能用List <A>调用add()

在TreeMap的情况下,如果将我们自己的类对象作为键传递,那么需要实现Comparable或Comparator的接口,为什么?

当我们要私有继承基类时,为什么要进行名称公开?

为什么我们要批量处理矩阵产品?

我们为什么要复制然后移动?

为什么我们要初始化 webelement?

我们为什么要守护进程?

为什么我们要完成可观察的?

为什么我们要多次擦拭磁盘?

为什么我可以自动装配EntityManagerInterface而不是UserInterface

Android:扩展应用程序类。为什么我们需要实现单例模式?

为什么我们需要使用标记接口?

为什么我必须在实现类而不是仅接口类上使用@RequestParam批注?

为什么 List 类要实现 IList 接口?

为什么我们在 HashMap 和 HashSet 中使用 equals() 方法而不实现比较器接口?

为什么我们要创建一个单独的函数来检测其他类的输入

为什么我们使用WebDriver而不是Selenium IDE?