springboot接口多态注入,spring多个实现类注入

  springboot接口多态注入,spring多个实现类注入

  00-1010一、问题描述二。比较低级的解决方案2.1。方案一:使用@Primary标注2.2。方案二:使用@Resource annotation 2.3。方案三:使用@Qualifier注释3。相对高级的解决方案

  00-1010在实际的系统应用开发中,我经常会遇到这样一种需求。相信你在工作中也会经常遇到:

  同一个系统部署在多个省份。

  一个业务是在北京实现的一种方式,是基于北京用户的需求。

  同样的业务在上海是另一种变现方式,和北京差不多。

  当遇到这样的需求时,我们通常会为业务实现定义一个接口,比如:

  公共接口IDemoService { public void do something();}在北京环境中,如:

  @ component公共类demoservicebeijng实现idemoservice { @ override public void do something(){ system . out . println(北京的业务实现);}}这是在上海环境中实现的,比如:

  @ component公共类demoserviceshanghai实现idemoservice { @ override public void do something(){ system . out . println(上海的业务实现);}}然后我们编写一个模拟的业务测试用例。

  @ springbootestclassdemoapplicationtests {//这里注入的demoService是DemoServiceShanghai还是DemoServiceBeijing?@ Resource IDemoService demo service;@ Test void testDemoService(){ demo service . do something();}}当我们执行这个测试用例时,肯定会报错,因为Spring已经找到了IDemoService的两个实现类。它不知道将哪个实现类实例化为IDemoService的实际业务处理bean。当然,我们期望的状态是:

  在北京部署系统时,DemoServiceBeijing作为IDemoService的实现类来完成依赖注入。

  在上海部署系统时,DemoServiceShanghai作为IDemoService的实现类来完成依赖注入。

  00-1010面对以上要求,我们来说几个相对低级的解决方案。虽然这些解决方案可以达到我们想要的状态,但是对于操作和维护来说不够友好。

  00-1010如果在北京部署系统时将@Primary添加到DemoServiceBeijing的类中,该注释的作用是从多个实现类中强制选择一个实现类。如果Spring不知道选哪个,我们就告诉它一个默认的。

  00-1010因为@Resource批注默认使用名称进行依赖注入,所以变量名显式地称为demoservicebuilding(小写),它使用demoservicebuilding实现类。

  @ ResourceIDemoService demoServiceBeijing;//此处的变量名指定bean名称//IDemoService demo service;被取代或

  @ resource(name= demoservicebidding )//使用资源批注显式指定名称IDemoService demoService

  00-1010和上面一样,使用@Qualifier注释来指定依赖注入的bean的名称。

  @ Qualifier( demoservicebeijng )//使用Qualifier批注显式指定名称@ resourceidemoservice demo service;虽然上面提到的三种方案都可以通过在不同的部署环境下使用不同的接口实现类来解决依赖注入的问题。但是这样不好,因为一旦我们把部署环境从北京(beijing)改成上海(shanghai),就需要修改上面注释的所有位置或者内容(所有的实现类代码都要修改)。

  00-1010我们提出了更进一步的期望:即只修改一个配置就可以切换部署环境。例如:

  部署:省3360北京当我们期望将部署环境从北京切换到上海时,只需要将上述配置中的北京改为上海即可。如何实现这一点?

  在北京的实现类中添加ConditionalOnProperty注释,havingValue的值为北京。

  @ component @ conditional property(value= deploy。 province ,havingValue= Beijing )公共类demoservicebuilding实现idemoservice {在上海的实现类上添加conditionalproperty注释,havingValue的值为上海。

  @Component @ ConditionalOnProperty(value= deploy.province ,Having value= Shanghai )公共类demoserviceshanghai实现ideo service { conditional on property注释在这里用于读取配置文件,找到deploy . province,将配置的值与Having value进行匹配,实例化哪个类将作为接口的实现类bean注入Spring容器(当然注入过程需要用@ Component注释实现)。

  这就是springboot接口的多个实现类的选择性注入的解决方案的细节。关于springboot接口多个实现类的选择性注入的更多信息,请关注风行IT的其他相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: