前言
前几个月和隔壁组的老王闲聊,他说我的项目的供应商到职率居高不下,最近还有开发刚接手ESB订阅公布接口才两周就提出到职,而他能做的就只有苦笑和默默地接过这个烂摊子了。
而然幸福的家庭总是类似的,而可怜的我却因业务改革走上了和老王一样的路线。单单是接口的开发竟然能迫使一位开发毅然决然地到职,我既不置信是兽性的扭曲,更不信是道德的沦丧。
抛开这个富裕色调的故事而言,我发现原来的我的项目存在如下问题:
- 没有应用任何古代依赖治理和构建工具(如Maven, Gradle),间接把所依赖的Jar包寄存在我的项目目录下的lib目录中,与日俱增导致lib目录下寄存大量无用Jar包;
- 没有应用代码版本管理工具治理代码;
- 技术文档欠缺,全靠徒弟带徒弟的形式传授框架应用形式和开发流程;
- 机械性配置项多,而起初的开发人员大多只能依葫芦画瓢增加配置,既容易出错同时又减少问题排查的难度。
针对前两个问题,咱们只需梳理出必须的依赖项并退出Maven或Gradle治理,而后托管到Git即可。
而后两者则能够通过spring-boot-starter将必选依赖项和配置对立治理,并附上相干技术文档;而后通过模板模式和注解简化开发流程,提供Demo升高入门难度。
最初就能够把具体的业务性能开发交给供应商解决,咱们分心做好过程治理和验收即可。
本文将着重分享spring-boot-starter开发的事项,请坐好扶稳!
命名标准
在自定义starter前咱们总要思考如何命名咱们的starter,而官网提供如下的命名标准:
- 官网的starter以spring-boot-starter作为前缀命名我的项目
如:spring-boot-starter-web - 非官方的则以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的性能
- 通过
@ConfigurationProperties
定义该starter注册bean时须要的属性汇合 - 通过
@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我的项目的工作
- 引入spring-boot-configuration-processor依赖项;
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
- 若src/resources/META-INF/spring-configuration-metadata.json不存在,那么执行
mvn compile
时会生成target/classes/META-INF/spring-configuration-metadata.json; - 复制target/classes/META-INF/spring-configuration-metadata.json到src/resources/META-INF/spring-configuration-metadata.json即可。
业务零碎我的项目的工作
- 引入spring-boot-configuration-processor依赖项;
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
- 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
发表回复