springboot整合activemq_⼿把⼿教你实现⾃定义SpringBoot的
Starter
引⾔
我们就⾃⼰来实现⼀个SpringBoot的 starter吧。废话不多说我们还是直⼊主题吧。
什么是Spring Boot Starter呢?我们直接来看看官⽹是怎么介绍的吧。
❝
Starters are a set of convenient dependency descriptors that you can include in your application. You get a one-stop shop for all the Spring and related technologies that you need without having to hunt through sample code and copy-paste loads of dependency descriptors. For example, if you want to get started using Spring and JPA for database access, include the spring-boot-starter-data-jpa dependency in your project.
❞
纳尼,⼀⼤堆的英⽂,这还有兴趣接着往下看吗?是不是看到这直接退出了。都到门⼝了,不进来喝杯茶再⾛嘛?看都看到这了还是接着继续往下看吧。我们先不解释这⼀段话是什么意思,我们可以看看starter的出现给我们解决了什么问题。我们还是以上述官⽹的例⼦来进⾏说明⽐如说我们需要在Spring 中适应JPA来操作数据库。在没有springBoot-starter之前,我们需要引⼊jpa的步骤
通过maven 引⼊jdbc的依赖、以及jpa相关的各种依赖
编写jpa相关的配置⽂件
⽹上各种查询资料进⾏调试,调试的过程对于新⼿可能会有点奔溃会遇到各种奇奇怪怪的问题,jar包冲突啊,这个jar包下载不下来,缺少某个jar包。
终于在经历千⾟万苦,哼次哼次的解决各种问题之后终于把项⽬跑起来了,然后把这次整合jpa遇到的问题,以及整合的步骤都⼀⼀的详细记录下来。⽅便下次在需要整合jpa的时候直接copy就好了。我们以前在没有starter之前是不是都是这么玩的。这样的缺点是不是也⾮常显著,⽐如过程复杂、需要不停的粘贴复制(不过这是程序员经常⼲的事情了,也不在乎多⼀两次了)、整合其它组件到⾃⼰的项⽬变的困难,效率低下。这也就造成了996的程序员⽐较多了(晚上就不能够回去69了)。
SpringBoot Starter的出现
starter的实现:虽然我们每个组件的starter实现各有差异,但是它们基本上都会使⽤到两个相同的内容:ConfigurationProperties和AutoConfiguration。因为Spring Boot提倡“「约定⼤于配置」”这⼀理念,所以我们使⽤ConfigurationProperties来保存我们的配置,并且这些配置都可以有⼀个默认值,即在我们没有主动覆写原始配置的情况下,默认值就会⽣效。除此之外,starter的ConfigurationProperties还使
得所有的配置属性被聚集到⼀个⽂件中(⼀般在resources⽬录下的application.properties),这样我们就告别了Spring项⽬中XML地狱。starter的出现帮把我们把各种复杂的配置都封装起来了,让我们真正的可以达到了开箱即⽤。不仅降低了我们使⽤它的门槛,并且还⼤⼤提⾼了我们的开发效率。正如前⾯所说《SpringBoot⾃动装配》让我们有更多的时间去陪⼥朋友。
实现⾃⼰的SpringBoot Starter
命名规范
如果你快有孩⼦了,出⽣前你⽐较急的⼀定是起个名字。孩⼦的姓名标识着你和你爱⼈的⾎统,⼀定不会起隔壁⽼王的姓⽒,肯定会招来异样的眼光。在maven中,groupId代表着姓⽒,artifactId代表着名字。Spring Boot也是有⼀个命名的建议的。所以名字是不能够随随便
便取得,可以按照官⽅的建议来取。
❝
What’s in a nameAll official starters follow a similar naming pattern; spring-boot-starter-*, where * is a particular type
of application. This naming structure is intended to help when you need to find a starter. The Maven integration in
many IDEs lets you search dependencies by name. For example, with the appropriate Eclipse or STS plugin installed,
you can press ctrl-space in the POM editor and type “spring-boot-starter” for a complete list.As explained in the
“Creating Your Own Starter” section, third party starters should not start with spring-boot, as it is reserved for
official Spring Boot artifacts. Rather, a third-party starter typically starts with the name of the project. For example, a
third-party starter project called thirdpartyproject would typically be named thirdpartyproject-spring-boot-starter.
❞
⼤概意思是官⽅的 starter 的命名格式为 spring-boot-starter-{xxxx} ⽐如spring-boot-starter-activemq第三⽅我们⾃⼰的命名格式为{xxxx}-spring-boot-starter。⽐如mybatis-spring-boot-starter。如果我们忽略这种约定,是不是会显得我们写的东西不够“专业“。
⾃定义⼀个Starter
下⾯我们就来实现⼀个⾃定义的的starter,命名为sms-spring-boot-starter。
1「引⼊pom」
org.springframework.boot spring-boot-starter org.springframework.boot spring-boot-configuration-processor trueorg.projectlombok 2「编写配置⽂件」
发短信我们需要配置⼀些账号信息,不同的短信供应商,账户信息是不⼀样的,所以我们需要定义⼀个XXXXProperties 来⾃动装配这些
账户信息。下⾯我们就以腾讯云和阿⾥云两家供应商为例;
@ConfigurationProperties(prefix = "sms")@Datapublic class SmsProperties { private SmsMessage aliyun = new SmsMessage(); private SmsMessage tencent
如果需要在其他项⽬中使⽤功能的话,我们只需要在配置⽂件(l)中配置SmsProperties 的属性信息就可以了。 ⽐
如:
sms: aliyun: pass-word: 12345 user-name: java⾦融 sign: 阿⾥云 url: aliyun/send tencent: pass-word: 6666 user-name: java⾦融 sign: 腾
还记的@ConfigurationProperties注解⾥⾯是不是有个prefix 属性,我们配置的这个属性是sms,配置这个的主要⼀个作⽤的话是主要⽤
来区别各个组件的参数。这⾥有个⼩知识点需要注意下当我们在配置⽂件输⼊sms我们的idea会提⽰这个sms有哪些属性可以配置,以及每
个属性的注释都有标记,建议的话注释还是写英⽂,这样会显得你⽐较专业。
这个提⽰的话,是需要引⼊下⾯这个jar的。
org.springframework.boot spring-boot-configuration-processor true
引⼊这个jar之后,我们编译之后就会在META-INF⽂件夹下⾯⽣成⼀个spring-configuration-metadata.json的⽂件。
我们可以看到这个⽂件其实 是根据SmsProperties类的成员属性来⽣成的。
3「然后在编写短信⾃动配置类:」
@EnableConfigurationProperties(value = SmsProperties.class)@Configurationpublic class SmsAutoConfiguration { /** * 阿⾥云的实现类 * @para 编写我们的实现类:
public class AliyunSmsSenderImpl implements SmsSender { private SmsMessage smsMessage; public AliyunSmsSenderImpl(SmsMessage smsPrope
4「让starter⽣效」
starter集成应⽤有两种⽅式:
被动⽣效我们⾸先来看下我们熟悉的⽅式,通过SpringBoot的SPI的机制来去加载我们的starter。我们需要在META-INF下新建⼀个spring.factories⽂件key为org.springframework.boot.autoconfigure.EnableAutoConfiguration, value是我们的
SmsAutoConfiguration 全限定名(「记得去除前后的空格,否则会不⽣效」)。
主动⽣效在starter组件集成到我们的Spring Boot应⽤时需要主动声明启⽤该starter才⽣效,通过⾃定义⼀个@Enable注解然后在把⾃动配置类通过Import注解引⼊进来。
@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documented@Import({SmsAutoConfiguration.class})public @interface EnableSm
使⽤的时候需要在启动类上⾯开启这个注解。
5.「打包,部署到仓库」如果是本地的话,直接通过mvn install命令就可以了。如果需要部署到公司的仓库话,这个就不说了。
6. 「新建⼀个新的SpringBoot项⽬引⼊我们刚写的starter」
com.workit.sms sms-spring-boot-starter 0.0.1-SNAPSHOT
在项⽬配置⽂件配上短信账号信息
activemq启动报错
测试代码
@SpringBootApplication@EnableSmspublic class AutoconfigApplication { public static void main(String[] args) { ConfigurableApplicationContext app
运⾏结果:
SmsMessage{userName='java⾦融', passWord='12345', sign='阿⾥云', url='aliyun/send'}开始==》短信内容:⽤阿⾥云SmsMessage{u
⾄此的话我们⾃定义的⼀个starter就已经完成了,这个starter只是⼀个演⽰的demo,代码有点粗糙,项⽬结构也有点问题。重点看下这个
实现原理就好。赶紧动动⼩⼿去实现⼀个⾃⼰的starter吧。
总结
SpringBoot starter的出现,让我们项⽬中集成其他组件变得简单。它把简单给了别⼈,把复杂留给了⾃⼰。“牺牲⼩我,成就⼤
我”的思想还是值得学习的。平时我们⼯作中,⽐如要开发⼀个组件、或者⼀个⼯具类,也应该尽可能的让使⽤⽅可以做到⽆脑使⽤,不要搞的太复杂,⼜能让使⽤者可以灵活扩展。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论