<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          springboot策略模式的另一種實現(xiàn)

          共 3824字,需瀏覽 8分鐘

           ·

          2022-06-27 02:03


          前言

          在很早之前,我們曾分享過springboot的一種策略模式實現(xiàn),在我們當(dāng)時的實現(xiàn)中,不僅需要自定義策略服務(wù)的初始化過程,而且我們還需要手動處理策略服務(wù)的類掃描邏輯,整個實現(xiàn)邏輯不僅繁瑣、不夠簡潔,而且需要增加項目的基礎(chǔ)配置類,一定程度上會破壞項目的整體架構(gòu),所以我在實際開發(fā)中也很少用,除非策略模式特別必須,而且策略服務(wù)特別多,否則我也不太愿意增加整套初始化操作。

          對之前策略模式實現(xiàn)過程感興趣的小伙伴(主要是通過自定義注解和自定義類的掃描、初始化過程實現(xiàn)策略注入),可以去回顧下:

          今天我們來分享另一種策略模式的實現(xiàn)方式,好處是實現(xiàn)簡單,不需要引入額外的配置類和繁瑣的服務(wù)初始化過程,下面我們就來一起看下具體的實現(xiàn)過程吧。

          實現(xiàn)過程

          首先,我們需要定義一個策略服務(wù)的接口,這個接口的作用就是為了讓具體的策略實現(xiàn),然后便于后面springboot幫我們注入到策略容器中,比如我們有一個TestInterface的策略接口,接口很簡單只有一個方法:

          public interface TestInterface {
              
              String hello();
          }

          它的實現(xiàn)分別是:

          這里需要留意的是,我們這里為每個策略的實現(xiàn)類制定了bean的名稱,這個名稱可以作為一種業(yè)務(wù)選擇器來使用,大家可以理解為策略類型,在后面的代碼中,我們可以看到,我們其實是可以根據(jù)這個名稱拿到對應(yīng)策略的實例的

          策略服務(wù)Test1

          @Service("Test1")
          public class Test1Impl implements TestInterface {
              @Override
              public String hello() {
                  return "Test1Impl";
              }
          }

          策略服務(wù)Test2

          @Service("Test2")
          public class Test2Impl implements TestInterface {
              @Override
              public String hello() {
                  return "Test2Impl";
              }
          }

          策略服務(wù)Test3

          @Service("Test3")
          public class Test3Impl implements TestInterface {
              @Override
              public String hello() {
                  return "Test3Impl";
              }
          }

          然后在我們需要用到策略服務(wù)的地方,注入我們策略服務(wù)的容器:

          @RestController
          public class TestController {
              // 可以將我們的策略注入到list中
              @Autowired
              private List<TestInterface> testInterfaces;
              // 或者注入到Map中
              @Autowired
              private Map<String, TestInterface> testInterfaceMap;

              @GetMapping("/test")
              public Object test(String name) {
                  int size = testInterfaces.size();
                  System.out.println(testInterfaces.get(2).hello());
                  TestInterface testInterface = testInterfaceMap.get(name);
                  System.out.println(testInterface.hello());
                  System.out.println(size);
                  return size;
              }
          }

          下面我們簡單測試一下:

          ###
          GET http://localhost:8088/test?name=Test1

          可以看到我們已經(jīng)拿到了Test1的策略服務(wù),執(zhí)行結(jié)果如下:

          整個過程是不是很簡單呢?這里的核心代碼其實就是這一行:

          @Autowired
          private Map<String, TestInterface> testInterfaceMap;

          這一段代碼的作用就是構(gòu)建策略服務(wù)的beanNamebean實例的映射關(guān)系,因為我們在testInterfaceMap變量上加了@Autowired注解,所以容器的填充其實是由spring boot幫我們自動完成的。

          這里我覺得有必要稍微解釋下,當(dāng)時看到有同事寫了類似這樣的代碼:

          @Autowired
          private List<TestInterface> testInterfaces;

          在接口的處理邏輯中,他直接循環(huán)遍歷上面的testInterfaces,然后調(diào)用接口的方法。

          我當(dāng)時第一眼看到這樣的代碼,我其實也是懵逼的,我尋思這testInterfaces沒有進行初始化操作,實際調(diào)用不會報錯嗎,我還以為他是在別的地方寫了初始化和注入的操作。

          然后找了半天也沒找到,最后和他探討之后,才知道,原來這樣的操作是spring boot本身就具備的特性(然鵝我竟然一直不知道),而且很簡單、很常用。

          今天我們用的Map的寫法,也是類似的操作,類似一種變形,在實際應(yīng)用的時候,稍微測試下應(yīng)該就可以琢磨出來,感覺也不太難,這玩意就是你不用,你永遠可能都不知道。

          總結(jié)

          今天的內(nèi)容很簡單,其實核心就是@Autowired的特殊使用,既是分享普及,又是回顧總結(jié)。分享普及是對壓根不知道的小伙伴而言的,比如我,回顧總結(jié)是對已經(jīng)應(yīng)用過的小伙伴。

          下面,我們再簡單對比下這種策略模式的一些區(qū)別,方便各位小伙伴根據(jù)自己的需求選用:

          今天我們實現(xiàn)的策略模式相比于之前我們實現(xiàn)的策略模式,更簡單、更方便,從代碼量上來說,也更簡潔,而且可以滿足我們?nèi)粘i_發(fā)中絕大多數(shù)的策略模式實現(xiàn)需求;

          但是它也有一定的局限性,如果我們的策略服務(wù)初始化過程中有一些特出的處理需求,比如注入特殊的配置文件,這時候我們之前的策略模式實現(xiàn)方式就顯得更靈活。

          簡單一句話總結(jié),就是前者小而簡單,后者大而靈活。

          最后,我們來說的題外話,最近一段時間,應(yīng)該說很久很久,我已經(jīng)沒有更新新的內(nèi)容了,原因很多,說起來很復(fù)雜,但是核心的點還是懶(不在狀態(tài)呀,卷不動了),不過從本次內(nèi)容的更新開始,就意味著失蹤人口的回歸(再不產(chǎn)出點東西,腦子都瓦特啦),所以未來我會盡可能分享更多有價值的內(nèi)容,好了,今天的內(nèi)容就先到這里吧,感謝各位小伙伴的關(guān)注和支持,晚安吧!

          - END -


          瀏覽 80
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  大粗鸡巴久久 | 精品无码免费一区二区三区 | 日逼网站免费观看 | 国产日韩在线视频 | 操女人视频网站 |