<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>

          SPI淺析

          共 1979字,需瀏覽 4分鐘

           ·

          2021-10-12 15:12

          SPI全稱Service provider interface,是一種服務(wù)發(fā)現(xiàn)機(jī)制。其通過resource/META-INF/services文件來查找具體的實(shí)現(xiàn)類,并加載到j(luò)vm中,因此可以對現(xiàn)有代碼進(jìn)行靈活的擴(kuò)展。再此我們先做個(gè)小的demo吧。
          一般來說我們知道做任何事情都要有個(gè)主線,你不能說上了一天班然后該干啥不知道,傻傻呼呼坐了一天,最后整個(gè)人都快要廢了的感覺。這樣的事情在編程這樣嚴(yán)密的事情上來說也是站不住腳的,在編程代碼編程中大的導(dǎo)向性我們是我們邏輯,在戰(zhàn)術(shù)層面比較重要的就是接口、父類、虛類這些了。所以說SPI所說的靈活的擴(kuò)展,不外乎接口、父類以及虛類的情況。So demo來了。
          定義接口
          package?com.example.demo.spi;/** * @Author tianjl * @Date 2021/10/11 10:11 * @Discription disc */public interface MySpi {

          void show();}
          實(shí)現(xiàn)類1
          package com.example.demo.spi.imp;
          import com.example.demo.spi.MySpi;

          /** * @Author tianjl * @Date 2021/10/11 10:12 * @Discription disc */public class MySpi1 implements MySpi { @Override public void show() { System.out.println("this is myspi one~~~~"); }}
          實(shí)現(xiàn)類2
          package com.example.demo.spi.imp;
          import com.example.demo.spi.MySpi;

          /** * @Author tianjl * @Date 2021/10/11 10:12 * @Discription disc */public class MySpi2 implements MySpi { @Override public void show() { System.out.println("this is myspi two~~~~"); }}
          在main/resources/services目錄下創(chuàng)建spi接口類路勁的文件,并將具體的實(shí)現(xiàn)類的路徑放入其中,如圖所示:
          在創(chuàng)建好這些類和文件之后,我們需要將我們的spi實(shí)現(xiàn)類用起來,所以這塊我們要編寫主要的調(diào)用類。
          public class TestSpi {

          public static void main(String[] args) { Iterator providers= Service.providers(MySpi.class); ServiceLoader loader=ServiceLoader.load(MySpi.class); while (providers.hasNext()){ MySpi service=providers.next(); service.show(); } System.out.println("------");

          Iterator iterator=loader.iterator(); while (iterator.hasNext()){ MySpi service=iterator.next(); service.show(); } }}
          運(yùn)行的結(jié)果如下:

          如上圖所示,spi的demo是跑起來了,我們可以想一下其實(shí)這個(gè)spi我們完全可以自己搞一套,因?yàn)槲覀冏x取的接口文件是固定的META-INF/services目錄,因?yàn)榻涌诼窂酱嬖冢涌趯?shí)現(xiàn)類的路徑也存在,所以采用jdk的反射輕松就可以進(jìn)行實(shí)例化。
          在jdbc中鏈接的初始化就采用了spi機(jī)制。
          說到這里,我們就了解了spi到底是個(gè)啥了,我們也可以通過java類中的靜態(tài)代碼進(jìn)行潛移默化的一些事。對于我們要擴(kuò)展或者摘除的一些類來說,修改services下對應(yīng)接口文件的內(nèi)容,并進(jìn)行重新reload接口文件即可。

          午安~



          瀏覽 36
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <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>
                  黄骗免费网站 | 国产午夜精品一区二区芒果视频 | 亚洲国产正在播放 | 五月丁香免费视频 | 操人网址 |