springboot的自定義starter

一埃碱、 SpringBoot starter機制

統(tǒng)一管理,統(tǒng)一引入 減少繁瑣配置酥泞,解決版本沖突

二砚殿、 自定義starter

1.開發(fā)中有很多獨立于業(yè)務的配置模塊,重復引用的時候在pom中引用即可使用芝囤。

例如:

  • 動態(tài)數(shù)據(jù)源似炎。
  • 登錄模塊辛萍。
  • 基于AOP技術實現(xiàn)日志切面。
    ......

2.自定義starter的命名規(guī)則

  • SpringBoot提供的starter以spring-boot-starter-xxx 的方式命名的羡藐。
  • 官方建議自定義的starter使用xxx-spring-boot-starter 命名規(guī)則贩毕。以區(qū)分SpringBoot生態(tài)提供
    的starter

3.實現(xiàn)

3.1 新建maven jar工程,工程名為ldz-spring-boot-starter仆嗦,導入依賴:

<dependencies>
        <dependency>
                <groupId>org.springframework.boot</groupId>
                                <artifactId>spring-boot-autoconfigure</artifactId>
                                <version>2.2.9.RELEASE</version>
                </dependency>
        </dependencies>

自動配置的核心依賴

3.2 編寫javaBean實體

@EnableConfigurationProperties(SimpleBean.class)
@ConfigurationProperties(prefix = "simplebean")
public class SimpleBean {
      private int id;
      private String name;
      public int getId() {
            return id;
      }
      public void setId(int id) {
            this.id = id;
      }
      public String getName() {
            return name;
      }
      public void setName(String name) {
            this.name = name;
      }
      @Override
      public String toString() {
            return "SimpleBean{" +
            "id=" + id +
            ", name='" + name + '\'' +
            '}';
      }
}

通用的配置類實體(在調用的工程中配置調用的屬性值)

3.3 編寫配置類MyAutoConfiguration

@Configuration
public class MyAutoConfiguration {
      static {
            System.out.println("MyAutoConfiguration init....");
      }
      @Bean
      public SimpleBean simpleBean(){
            return new SimpleBean();
      }
}

實例化通用Javabean的類辉阶,這個類實例化的時候@Bean方法的結果會作為spring的bean放到ioc容器中,交由spring管理.

3.4 resources下創(chuàng)建/META-INF/spring.factories

META-INF是自己手動創(chuàng)建的目錄欧啤,spring.factories也是手動創(chuàng)建的文件,在該文件中配置自
己的自動配置類

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.lagou.config.MyAutoConfiguration

spring啟動的時候會根據(jù)key:org.springframework.boot.autoconfigure.EnableAutoConfiguration加載/META-INF/spring.factories下的value睛藻,然后實例化,并且執(zhí)行@bean方法邢隧,進行配置bean的實例化店印。

4. 使用自定義starter

4.1 導入自定義starter的依賴

      <dependency>
           <groupId>com.lagou</groupId>
           <artifactId>ldz-spring-boot-starter</artifactId>
           <version>1.0-SNAPSHOT</version>
      </dependency>

4.2 在全局配置文件中配置屬性值

simplebean.id=1
simplebean.name=自定義starter

4.2 測試

//測試自定義starter
      @Autowired
      private SimpleBean simpleBean;
      @Test
      public void zdyStarterTest(){
            System.out.println(simpleBean);
      }

三、 如果有一天我們不想要啟動工程的時候自動裝配SimpleBean

1. 刪除pom.xml中的依賴 (low)

2. 熱插拔技術

我們經(jīng)常會在啟動類Application上面加@EnableXXX注解倒慧,其實這個@Enablexxx注解就是一種熱拔插技術按摘,加了這個注解就可以啟動對應的starter,當不需要對應的starter的時候只需要把這個注解注釋掉就行纫谅。

2.1 改造ldz工程新增熱插拔支持類

2.1.1 新增標記類ConfigMarker

   public class ConfigMarker {
   }

2.1.2 新增EnableRegisterServer注解

    @Target({ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    @Import({ConfigMarker.class})
    public @interface EnableRegisterServer {
    }

2.1.3 改造MyAutoConfiguration

新增條件注解@ConditionalOnBean(ConfigMarker.class) 炫贤,
@ConditionalOnBean 這個是條件注解,前面的意思代表只有當期上下文中含有ConfigMarker對象付秕,被標注的類才會被實例化兰珍。

@Configuration
@ConditionalOnBean(ConfigMarker.class)
public class MyAutoConfiguration {
        static {
        System.out.println("MyAutoConfiguration init....");
        }
        @Bean
        public SimpleBean simpleBean(){
        return new SimpleBean();
        }
}

2.1.4 改造調用工程

在啟動類上新增@EnableImRegisterServer注解


vvv.PNG

當加了@EnableImRegisterServer 的時候啟動zdy工程就會自動裝配SimpleBean,反之則不裝配询吴。

2.1.4 原理

當加了@EnableImRegisterServer 注解的時候掠河,由于這個注解使用了@Import({ConfigMarker.class}) ,所以會導致Spring去加載ConfigMarker 到上下文中猛计,而又因為條件注@ConditionalOnBean(ConfigMarker.class) 的存在唠摹,所以MyAutoConfiguration 類就會被實例化。

3 關于條件注解的講解

  • @ConditionalOnBean:僅僅在當前上下文中存在某個對象時奉瘤,才會實例化一個Bean勾拉。
  • @ConditionalOnClass:某個class位于類路徑上,才會實例化一個Bean盗温。
  • @ConditionalOnExpression:當表達式為true的時候藕赞,才會實例化一個Bean÷艟郑基于SpEL表
    達式的條件判斷斧蜕。
  • @ConditionalOnMissingBean:僅僅在當前上下文中不存在某個對象時,才會實例化一個
    Bean吼驶。
  • @ConditionalOnMissingClass:某個class類路徑上不存在的時候惩激,才會實例化一個Bean。
  • @ConditionalOnNotWebApplication:不是web應用蟹演,才會實例化一個Bean风钻。
  • @ConditionalOnWebApplication:當項目是一個Web項目時進行實例化。
  • @ConditionalOnProperty:當指定的屬性有指定的值時進行實例化酒请。
  • @ConditionalOnJava:當JVM版本為指定的版本范圍時觸發(fā)實例化骡技。
  • @ConditionalOnResource:當類路徑下有指定的資源時觸發(fā)實例化。
  • @ConditionalOnJndi:在JNDI存在的條件下觸發(fā)實例化羞反。
  • @ConditionalOnSingleCandidate:當指定的Bean在容器中只有一個布朦,或者有多個但是指定
    了首選的Bean時觸發(fā)實例化。
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末昼窗,一起剝皮案震驚了整個濱河市是趴,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌澄惊,老刑警劉巖唆途,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異掸驱,居然都是意外死亡肛搬,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門毕贼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來温赔,“玉大人,你說我怎么就攤上這事鬼癣√赵簦” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵扣溺,是天一觀的道長骇窍。 經(jīng)常有香客問我,道長锥余,這世上最難降的妖魔是什么腹纳? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮驱犹,結果婚禮上嘲恍,老公的妹妹穿的比我還像新娘。我一直安慰自己雄驹,他們只是感情好佃牛,可當我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著医舆,像睡著了一般俘侠。 火紅的嫁衣襯著肌膚如雪象缀。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天爷速,我揣著相機與錄音央星,去河邊找鬼。 笑死惫东,一個胖子當著我的面吹牛莉给,可吹牛的內容都是我干的。 我是一名探鬼主播廉沮,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼颓遏,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了滞时?” 一聲冷哼從身側響起叁幢,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎漂洋,沒想到半個月后遥皂,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡刽漂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年演训,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贝咙。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡样悟,死狀恐怖,靈堂內的尸體忽然破棺而出庭猩,到底是詐尸還是另有隱情窟她,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布蔼水,位于F島的核電站震糖,受9級特大地震影響,放射性物質發(fā)生泄漏趴腋。R本人自食惡果不足惜吊说,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望优炬。 院中可真熱鬧颁井,春花似錦、人聲如沸蠢护。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽葵硕。三九已至眉抬,卻和暖如春贯吓,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蜀变。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工宣决, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人昏苏。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像威沫,于是被迫代替她去往敵國和親贤惯。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內容