<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      spring接口多實現類,該依賴注入哪一個?

      一、問題的描述

      在實際的系統應用開發中我經常會遇到這樣的一類需求,相信大家在工作中也會經常遇到:

      • 同一個系統在多個省份部署。
      • 一個業務在北京是一種實現方式,是基于北京用戶的需求。
      • 同樣的業務在上海是另外一種實現方式,與北京的實現方式大同小異

      遇到這樣的需求,我們通常會定義一個業務實現的接口,比如:

      public interface IDemoService {
        public void doSomething();
      }
      

      在北京環境下這樣實現,比如:

      @Component
      public class DemoServiceBeijing implements IDemoService {
        @Override
        public void doSomething() {System.out.println("北京的業務實現");}
      }
      

      在上海環境下這樣實現,比如:

      @Component
      public class DemoServiceShanghai implements IDemoService {
        @Override
        public void doSomething() {System.out.println("上海的業務實現");}
      }
      

      然后我們寫一個模擬業務測試用例

      @SpringBootTest
      class DemoApplicationTests {
          //這里注入的demoService是DemoServiceShanghai,還是DemoServiceBeijing?
          @Resource
          IDemoService demoService;  
          @Test
          void testDemoService() {
              demoService.doSomething();
          }
      }
      

      當我們執行這個測試用例的時候一定會報錯,因為Spring發現了兩個IDemoService的實現類。它不知道去實例化哪一個實現類,來作為IDemoService的實際業務處理bean。當然我們期望的狀態是:

      • 在北京部署系統的時候,使用DemoServiceBeijing作為IDemoService的實現類完成依賴注入
      • 在上海部署系統的時候,使用DemoServiceShanghai作為IDemoService的實現類完成依賴注入

      二、相對低級解決方案

      面對上面的需求,先說幾個相對低級的解決方案,這幾個方案雖然可以實現我們期望的狀態,但是對運維不夠友好。

      2.1. 方案一:使用@Primary注解

      假如在北京部署系統的時候,在DemoServiceBeijing的類上面加上@Primary,該注解的作用就是強迫從多個實現類里面選一個實現類,如果Spring不知道選哪一個,我們告訴它一個默認的。

      @Primary
      @Component
      public class DemoServiceBeijing implements IDemoService {
      

      2.2. 方案二:使用@Resource注解

      因為Resource注解默認使用名稱進行依賴注入,所以變量名明確叫做demoServiceBeijing(首字母小寫),使用的就是DemoServiceBeijing實現類。

      @Resource
      IDemoService demoServiceBeijing;  //這里的變量名稱指定了bean名稱
      //IDemoService demoService;  被替換掉
      

      或者

      @Resource(name = "demoServiceBeijing")  //使用resource注解明確指定名稱
      IDemoService demoService;
      

      2.3.方案三:使用@Qualifier注解

      與上文同樣的道理,使用@Qualifier注解,指定bean的名稱進行依賴注入

      @Qualifier("demoServiceBeijing")  //使用Qualifier注解明確指定名稱
      @Resource
      IDemoService demoService;
      

      上面所提到的三個方案雖然都可以解決:在不同的部署環境下使用不同的接口實現類完成依賴注入的問題。但是這樣不好,因為一旦我們要把部署環境從beijing(北京)換成shanghai(上海),就需要把上面的注解的位置或者內容全都修改一遍(所有的實現類代碼都要修改)。

      三、相對高級的解決方案

      我們提出進一步的期望:就是只修改一個配置就能完成部署環境切換的操作。比如:

      deploy:
        province: beijing
      

      當我們期望把部署環境從北京切換到上海的時候,只需要將上文配置中的beijing 改成 shanghai ,這該怎么實現呢?

      • 在北京的實現類上面加上ConditionalOnProperty注解,havingValue的值為beijing
      @Component
      @ConditionalOnProperty(value="deploy.province",havingValue = "beijing")
      public class DemoServiceBeijing implements IDemoService {
      
      • 在上海的實現類上面加上ConditionalOnProperty注解,havingValue的值為shanghai
      @Component
      @ConditionalOnProperty(value="deploy.province",havingValue = "shanghai")
      public class DemoServiceShanghai implements IDemoService {
      

      ConditionalOnProperty注解在這里的作用就是:讀取配置文件發現deploy.province,并將該配置的值與havingValue匹配,匹配上哪一個就實例化哪一個類作為該接口的實現類bean注入到Spring容器中(當然注入過程需要配合@Component注解實現)。

      歡迎關注我的公告號:字母哥雜談,回復003贈送作者專欄《docker修煉之道》的PDF版本,30余篇精品docker文章。字母哥博客:zimug.com

      posted @ 2022-08-24 03:45  字母哥博客  閱讀(1175)  評論(1)    收藏  舉報
      主站蜘蛛池模板: 麻豆麻豆麻豆麻豆麻豆麻豆| 色悠悠国产精品免费在线| 亚洲一区二区不卡av| 色噜噜狠狠色综合成人网| 国产成人亚洲综合图区| 97碰碰碰免费公开在线视频| 日韩av片无码一区二区不卡 | 国产99视频精品免视看9| 欧美牲交40_50a欧美牲交aⅴ| 国产成人午夜精品影院| 亚洲精品一区二区三天美| 亚洲精品成人A在线观看| 亚洲国产高清av网站| 久久亚洲国产精品五月天| 色噜噜一区二区三区| 久久人妻无码一区二区三区av | 日日碰狠狠躁久久躁96avv| 亚洲男人天堂东京热加勒比| 亚洲色偷偷色噜噜狠狠99| 欧美成人精品三级网站| 国产午夜福利av在线麻豆| 亚洲精品日韩在线观看| 亚洲综合91社区精品福利| 国产精品视频午夜福利| 国产精品久久无码不卡黑寡妇| 久久这里只精品国产2| 国产一区二区三区十八禁| 性色欲情网站| 国产老熟女无套内射不卡| 日本熟妇色xxxxx| 久久精品国产久精国产| 开心激情站一区二区三区| 精品国产中文字幕av| 末成年娇小性色xxxxx| 丰满少妇熟乱xxxxx视频| 亚洲午夜无码久久久久蜜臀av | 文安县| 中文字幕一区二区精品区| 国产影片AV级毛片特别刺激| 国产一级黄色片在线播放| 亚洲有无码中文网|