SpringBoot魔法堂:说说带智能提示的spring-boot-starter
前言
前几个月和隔壁组的老王闲聊,他说项目的供应商离职率居高不下,最近还有开发刚接手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/fsjohnhuang/p/13956039.html —— ^_^肥仔John
SpringBoot魔法堂:说说带智能提示的spring-boot-starter的更多相关文章
- 如何取消MSSQL自带智能提示步骤,使用第三方智能提示插件
步骤1如下: [工具]——[选项]——[文本编辑器]——[Transact-SQL]——[IntelliSense]——[Transact-SQL IntelliSense 设置]——(取消选择)—— ...
- SpringBoot | 第二十八章:监控管理之Spring Boot Admin使用
前言 上一章节,我们介绍了Actuator的使用,知道了可通过访问不同的端点路径,获取相应的监控信息.但使用后也能发现,返回的监控数据都是以JSON串的形式进行返回的,对于实施或者其他人员来说,不是很 ...
- SpringBoot学习(一)—— idea 快速搭建 Spring boot 框架
简介 优点 Spring Boot 可以以jar包的形式独立运行,运行一个Spring Boot 项目只需要通过 java -jar xx.jar 来运行. Spring Boot 可以选择内嵌Tom ...
- SpringBoot魔法堂:应用热部署实践与原理浅析
前言 后端开发的同学想必每天都在重复经历着修改代码.执行代码编译,等待--重启Tomcat服务,等待--最后测试发现还是有bug,然后上述流程再来一遍(我听不见)
- SpringBoot魔法堂:@MatrixVariable参数注解使用详解
前言 RFC3986定义URI的路径(Path)中可包含name-value片段,扩充了以往仅能通过查询字符串(Query String)设置可选参数的囧境. 假如现在需要设计一个用于"搜索 ...
- SpringBoot 之Spring Boot Starter依赖包及作用
Spring Boot 之Spring Boot Starter依赖包及作用 spring-boot-starter 这是Spring Boot的核心启动器,包含了自动配置.日志和YAML. spri ...
- SpringBoot 之Spring Boot Starter依赖包及作用(自己还没有看)
spring-boot-starter 这是Spring Boot的核心启动器,包含了自动配置.日志和YAML. spring-boot-starter-amqp 通过spring-rabbit来支持 ...
- Spring Boot自定义配置实现IDE自动提示
一.背景 官方提供的spring boot starter的配置项,我们用IDE配置的时候一般都有自动提示的,如下图所示 而我们自己自定义的配置却没有,对开发非常不友好容易打错配置,那这个是怎样实现的 ...
- vscode spring boot配置文件application.properties不提示解决方式
背景 因实际的编程环境是jdk1.6,vscode安装了spring boot tools开发后,application.properties无法提示.spring boot tools的功能之一就是 ...
随机推荐
- ASP。NET MVC (NetCore 2.0)用于处理实体框架、DbContexts和对象的通用控制器和视图
下载source - 1.5 MB 介绍 本文的源代码已更新到NetCore 2.0 ASP.净MVC项目. 当我们开始开发一个ASP.在Microsoft Visual Studio中,我们发现通过 ...
- Hello World背后的事情
Hello World是不少人学习C++的第一项内容,代码看似简单,很多东西却涉及根本 #include <iostream> using namespace std; int main( ...
- C#数据结构-静态链表
对于双向链表中的节点,都包括一个向前.向后的属性器用于指向前后两个节点,对于引用类型,对象存储的是指向内存片段的内存指针,那么我们可以将其简化看作向前向后的两个指针. 现在我们将引用类型替换为值类型i ...
- python程序整理(2)
# 写一个函数完成三次登陆功能: # 用户的用户名密码从一个文件register中取出. # register文件包含多个用户名,密码,用户名密码通过|隔开,每个人的用户名密码占用文件中一行. # 完 ...
- 【人人都懂密码学】一篇最易懂的Java密码学入门教程
密码与我们的生活息息相关,远到国家机密,近到个人账户,我们每天都在跟密码打交道: 那么,密码从何而来?生活中常见的加密是怎么实现的?怎么保证个人信息安全?本文将从这几方面进行浅谈,如有纰漏,敬请各位大 ...
- 用CentOS 7自制Vagrant Box文件
写在前面 利用vagrant保持开发生产环境一致是一个很好的方法,不过vagrant官网上的box文件下载是真的很慢,因此,这里教大家如何自制box文件. 这篇文章你会接触到: vagrant使用 ...
- ImageMagick:用identify得到图片的平均颜色(基本颜色/主色调)
一,平均颜色的用途: 很多app在流式的展示图片时, 在图片没加载出来之前, 不是使用统一的背景图, 而是先显示一个纯色的背景, 而背景色和图片的颜色非常接近, 这样给用户的体验会更好. 我们这里演示 ...
- 第十九章 DHCP原理介绍
一.为什么使用DHCP 1.手动为局域网中大量主机配置IP地址.掩码.网关等参数的工作繁琐,容易出错 2.DHCP可以自动为局域网中主机完成TCP/IP协议配置 3.DHCP自动配置避免了IP地址冲突 ...
- cp: cannot stat: filepath Permission denied
在执行 cp -r frompath topath时,报错cp: cannot stat: frompath Permission denied. 百度,google都没有找到解决方案,无意中发现,原 ...
- 刷题不应该刷leecode 应该刷oj
因为leecode有很多题目 表述不清 意义不明 最关键的是 leecode压根不规定输入输出的格式 这个完全不是竞赛的风格 这样会养成很多坏习惯