乐趣区

关于java:SpringBoot魔法堂说说带智能提示的springbootstarter

前言

前几个月和隔壁组的老王闲聊,他说我的项目的供应商到职率居高不下,最近还有开发刚接手 ESB 订阅公布接口才两周就提出到职,而他能做的就只有苦笑和默默地接过这个烂摊子了。
而然幸福的家庭总是类似的,而可怜的我却因业务改革走上了和老王一样的路线。单单是接口的开发竟然能迫使一位开发毅然决然地到职,我既不置信是兽性的扭曲,更不信是道德的沦丧。
抛开这个富裕色调的故事而言,我发现原来的我的项目存在如下问题:

  1. 没有应用任何古代依赖治理和构建工具(如 Maven, Gradle),间接把所依赖的 Jar 包寄存在我的项目目录下的 lib 目录中,与日俱增导致 lib 目录下寄存大量无用 Jar 包;
  2. 没有应用代码版本管理工具治理代码;
  3. 技术文档欠缺,全靠徒弟带徒弟的形式传授框架应用形式和开发流程;
  4. 机械性配置项多,而起初的开发人员大多只能依葫芦画瓢增加配置,既容易出错同时又减少问题排查的难度。

针对前两个问题,咱们只需梳理出必须的依赖项并退出 Maven 或 Gradle 治理,而后托管到 Git 即可。
而后两者则能够通过 spring-boot-starter 将必选依赖项和配置对立治理,并附上相干技术文档;而后通过模板模式和注解简化开发流程,提供 Demo 升高入门难度。
最初就能够把具体的业务性能开发交给供应商解决,咱们分心做好过程治理和验收即可。

本文将着重分享 spring-boot-starter 开发的事项,请坐好扶稳!

命名标准

在自定义 starter 前咱们总要思考如何命名咱们的 starter,而官网提供如下的命名标准:

  1. 官网的 starter 以 spring-boot-starter 作为前缀命名我的项目
    如:spring-boot-starter-web
  2. 非官方的则以 spring-boot-starter 作为后缀命名我的项目
    如:mybatis-spring-boot-starter

我的项目构造

通过 Spring Initializr 或 Spring Boot CLI 创立我的项目构造后,将 pom.xml 的相干我的项目批改为如下内容

<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 订阅服务的配置我的项目为

@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;
    }
}

属性配置项

// 从 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 的我的项目要如何启用配置呢?其实有两种形式,别离为手动和主动,其中咱们会着重解说主动启用配置。

手动启用配置

所谓手动启用配置其实就是在 SpringBoot 入口类上增加启用配置用的自定义注解,针对下面的 EsbServerConfiguration 咱们能够自定义 EnableESBSrv 注解

@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

退出移动版