为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

拉丁的传说 2019-12-07 16:12:50
例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?为什么我们要对接口而不是已实现的类进行自动装配?
查看完整描述

2 回答

?
万千封印

TA贡献1891条经验 获得超3个赞

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中将注入type的实例B。


查看完整回答
反对 回复 2019-12-07
  • 2 回答
  • 0 关注
  • 1001 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信