SpringBoot魔法堂:說說帶智能提示的spring-boot-starter

前言

前幾個月和隔壁組的老王閒聊,他說項目的供應商離職率居高不下,最近還有開發剛接手ESB訂閱發佈接口才兩週就提出離職,而他能作的就只有苦笑和默默地接過這個爛攤子了。
而然幸福的家庭老是類似的,而不幸的我卻因業務變革走上了和老王同樣的道路。單單是接口的開發竟然能迫使一位開發毅然決然地離職,我既不相信是人性的扭曲,更不信是道德的淪喪。
拋開這個富有色彩的故事而言,我發現原來的項目存在以下問題:html

  1. 沒有使用任何現代依賴管理和構建工具(如Maven, Gradle),直接把所依賴的Jar包存放在項目目錄下的lib目錄中,日積月累致使lib目錄下存放大量無用Jar包;
  2. 沒有使用代碼版本管理工具管理代碼;
  3. 技術文檔欠缺,全靠師傅帶徒弟的方式傳授框架使用方式和開發流程;
  4. 機械性配置項多,然後來的開發人員大多隻能依葫蘆畫瓢添加配置,既容易出錯同時又增長問題排查的難度。

針對前兩個問題,咱們只需梳理出必須的依賴項並加入Maven或Gradle管理,而後託管到Git便可。
然後二者則能夠經過spring-boot-starter將必選依賴項和配置統一管理,並附上相關技術文檔;而後經過模板模式和註解簡化開發流程,提供Demo下降入門難度。
最後就能夠把具體的業務功能開發交給供應商處理,咱們專心作好過程管理和驗收便可。web

本文將着重分享spring-boot-starter開發的事項,請坐好扶穩!spring

命名規範

在自定義starter前咱們總要思考如何命名咱們的starter,而官方提供以下的命名規範:apache

  1. 官方的starter以spring-boot-starter做爲前綴命名項目
    如:spring-boot-starter-web
  2. 非官方的則以spring-boot-starter做爲後綴命名項目
    如:mybatis-spring-boot-starter

項目結構

經過Spring Initializr或Spring Boot CLI建立項目結構後,將pom.xml的相關項目修改成以下內容json

<parent>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-parent</artifacId>
  <version>2.3.1.RELEASE</version>
  <relativePath/>
</parent>

<dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
  </dependency>

  <!-- 下面爲自定義Starter的依賴項 -->
</dependencies>

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-compiler-plugin</artifactId>
      <configuration>
    <source>1.8</source>
    <target>1.8</target>
      </configuration>
    </plugin>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-source-plugin</artifactId>
      <version>2.4</version>
      <executions>
    <execution>
      <goals>
        <goal>jar</goal>
      </goals>
    </execution>
      </executions>
    </plugin>
  </plugins>
</build>

在starter中咱們會定義SpringBean的註冊配置和屬性配置,如ESB訂閱服務的配置項目爲mybatis

@Configuration
@EnableConfigurationProperties({EsbServerProperties.class})
public class EsbServerConfiguration {
    @Bean
    public SpringBus springBus(){
        return new SpringBus();
    }

    @Bean
    public LoggingFeature loggingFeature(){
        return new LoggingFeature();
    }

    @Bean
    public List<JMSConfigFeature> jmsConfigFeatures(EsbServerProperties props) throws JMSException {
        List<JMSConfigFeature> features = new ArrayList<>();
          
        /** 
         * 這裏會使用EsbServerProperties的屬性構建Bean實例
         */

        return features;
    }
}

屬性配置項app

// 從application.yml等配置文件中讀取並綁定esb.server.destination等屬性值
@Data
@ConfigurationProperties("esb.server")
public class EsbServerProperties {
    String destination;
    int currConsumers = 1;
    String channel;
    int ccsid = 1205;
    int transportType = 1;
    List<String> connectionNameLists;
    boolean replyError = false;
    String replySuccessText = "Success";
    String replyErrorText = "Failure";
}

到這裏咱們已經完成一個基本的starter的功能框架

  1. 經過@ConfigurationProperties定義該starter註冊bean時須要的屬性集合
  2. 經過@Configuration定義該starter註冊的bean

但引用該starter的項目要如何啓用配置呢?其實有兩種方式,分別爲手動和自動,其中咱們會着重講解自動啓用配置。maven

手動啓用配置

所謂手動啓用配置其實就是在SpringBoot入口類上添加啓用配置用的自定義註解,針對上面的EsbServerConfiguration咱們能夠自定義EnableESBSrv註解spring-boot

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import({EsbServerConfiguration.class})
public @interface EnableEsbSrv {
}

而後入口類的@SpringBootApplication註解先後添加@EnableEsbSrv便可。

讓人省心省力的自動啓用配置

自動啓用配置即只需在pom.xml中引入所依賴的starter,而後啓用應用便可自動啓用該starter的@Configuration所註解的類從而註冊Bean和讀取屬性配置。
而這一切都是由AutoConfigurationImportSelector來操刀,而咱們能夠經過@EnableAutoConfiguration@SpringBootApplication等實例化AutoConfigurationImportSelector類,配合菜譜resources/META-INF/spring.factories實現自動化配置的功能。
具體手法就是:將EsbServerConfiguration的全限類名稱寫在resources/META-INF/spring.factories的org.springframework.boot.autoconfigure.EnableAutoConfiguration下, 若存在多個則用逗號分隔。

org.springframework.boot.autoconfigure.EnableAutoConfiguration = \
com.john.starter.EsbServerConfiguration,\
com.john.starter.OtherConfiguration

好與更好——集成IDE智能提示

應用啓動時會將application.yml中對應的配置項綁定到@ConfigurationProperties標註的類實例上,那麼對於應用開發人員而言平常工做就是修改application.yml的配置項。但IDE又缺乏配置項的智能提示,那就很低效了。幸好Spring Boot早就爲咱們提供好解決方案,分爲手工和自動兩種。爲了效率固然是能夠自動就不用手動的了。

Starter項目的工做

  1. 引入spring-boot-configuration-processor依賴項;
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-configuration-processor</artifactId>
  <optional>true</optional>
</dependency>
  1. 若src/resources/META-INF/spring-configuration-metadata.json不存在,那麼執行mvn compile時會生成target/classes/META-INF/spring-configuration-metadata.json;
  2. 複製target/classes/META-INF/spring-configuration-metadata.json到src/resources/META-INF/spring-configuration-metadata.json便可。

業務系統項目的工做

  1. 引入spring-boot-configuration-processor依賴項;
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-configuration-processor</artifactId>
  <optional>true</optional>
</dependency>
  1. IDEA安裝Spring Assistant插件,並啓用Enable annotation processing(勾選 Settings/Build, Execution & Deployment/Compiles/Annotation Processors/Enable annotation processing)。

總結

spring-boot-starter很是適合用於團隊的技術積累和沉澱,不過想恰到好處地應用起來,不只要須要深刻Spring內部原理還要梳理清楚業務邏輯。後續咱們再深刻探討Spring內核的事情吧!

轉載請註明來自:https://www.cnblogs.com/fsjoh... —— ^_^肥仔John

相關文章
相關標籤/搜索