转载

如何在 Spring Boot 中自定义启动器 Starter

前言

Spring Boot 最大的特性可以说就是 开箱即用 ,内部提供的默认自动配置功能,让我们可以在 "零配置" 的情况下,就能够很方便地集成第三方框架。

这一切都要归功于 启动器 starter , 比如说,想搭建一个 Spring Boot Web 项目,我们只需要添加 spring-boot-starter-web 依赖即可,可以在不做一行配置的情况下,启动一个 Tomcat 应用。

下面是我们常用的 starter 启动器:

  • 单元测试:  spring-boot-starter-web ;

  • 数据库持久层框架 JPA:  spring-boot-starter-data-jpa

  • 安全框架:  spring-boot-starter-security ;

  • Redis 缓存:  spring-boot-starter-data-redis

  • ....

如何在 Spring Boot 中自定义启动器 Starter

用起来是爽了,但是也有人抱怨不如以前的 SSM 框架那样透明化,虽然配置是烦了点,但是我至少知道我开启了哪些功能,如今用了 Spring Boot 后,出了问题,压根不知道问题根源在哪里,蛋疼!

所以说,了解启动器 starter 默认地自动化配置是如何工作的,还是非常有必要的!本文以手写一个自定义的入门级 starter , 带你了解其工作原理。

实践

需求描述

假设我们有这样一个需求:需要自定义一个 女盆友 starter , 她带有一个问候的功能,要如何来实现呢?

新建 maven 项目

如何在 Spring Boot 中自定义启动器 Starter

为其取名为: girl-friend-spring-boot-starter .

Spring 官方对 starter 的命名是有规范的,只有官方提供的 starter , 才能命名为 spring-boot-starter-{name} , 比如 spring-boot-starter-web ; 而对于非官方的,需以 {name}-spring-boot-starter 的格式命名。

添加 spring-boot-autoconfigure 依赖

pom.xml 文件内容如下:

新增功能类

新增下面三个类:

  • GirlFriendServiceProperties (配置类);

  • GirlFriendService (女盆友接口);

  • GirlFriendServiceImpl (女盆友接口实现);

上源码:

GirlFriendServiceProperties.java :

@ConfigurationProperties 注解能够自动获取 application.properties 配置文件中前缀为 spring.girlfriend 节点下 message 属性的内容,这里我们给了它一个默认值: Hi,good morning!

GirlFriendService.java :

GirlFriendServiceImpl.java :

GirlFriendServiceImpl 实现了 GirlFriendService 接口的 say() 方法,它会获取 GirlFriendServiceProperties 配置类 message 内容,并打印到控制台。

硬菜:新增自动配置类

创建类 GirlFriendAutoConfiguration.java 来实现自动配置化功能:

接下来,对上面相关注解说明一下:

  • @Configuration : 标注类为一个配置类,让 spring 去扫描它;

  • @ConditionalOnClass :条件注解,只有在  classpath 路径下存在指定 class 文件时,才会实例化 Bean;

  • @EnableConfigurationProperties :使指定配置类生效;

  • @Bean : 创建一个实例类注入到 Spring Ioc 容器中;

  • @ConditionalOnMissingBean :条件注解,意思是,仅当 Ioc 容器不存在指定类型的 Bean 时,才会创建 Bean。

新增 spring.factories 文件

resources 目录下创建名为 META-INF 的目录,并新建文件 spring.factories ,内容如下:

Spring Boot 会在启动时,自动会去查找指定文件 /META-INF/spring.factories ,若有,就会根据配置的类的全路径去自动化配置。

完成这一步后,一个入门级的 spring-boot-starter 已经开发完成了,看下整体的目录结构:

如何在 Spring Boot 中自定义启动器 Starter

打包 jar

接下来,就是将 girl-friend-spring-boot-starter 打成 jar 包,放到本地的 maven 仓库中去,在项目根路径下执行 maven 命令: mvn clean install .

新建一个 Spring Boot Web 项目,引用自定 starter

新创建一个 Spring Boot Web 项目,在 pom.xml 文件中加入自定义的 starter 依赖:

Applicaiton 启动类中,自动注入 GirlFriendService 实例,并调用 say() 方法:

启动项目,看看在零配置的情况下,它的输出:

如何在 Spring Boot 中自定义启动器 Starter

可以看到,在没做任何配置的情况下,输出的是默认打招呼信息: Hi, good morning ! ,接下来,我们手动配置一下新的打招呼内容,看看是否能自动获取到。

application.properties 文件中配置如下:

重启项目,验证一下,是否输出的还是默认信息:

如何在 Spring Boot 中自定义启动器 Starter

正确打印我们自己配置的: I LOVE YOU

GitHub 源码地址

https://github.com/weiwosuoai/spring-boot-tutorial

总结

此文中,我们学习了如何自定义入门级 spring-boot-starter ,这仅仅是个开始,能做的远不止于此,这里也只是抛砖引玉而已,希望您阅读愉快!

·END·

近期热文:

  • Java8 新特性并发篇(一) | 线程与执行器

  • 如何在 Java8 中风骚走位避开空指针异常

  • 干货 | Java8 新特性指导手册

如果你喜欢本文

请长按二维码,关注 小哈学Java

如何在 Spring Boot 中自定义启动器 Starter

转发朋友圈,是对我最大的支持。

看完,赶紧点个“好看”鸭

点鸭点鸭

↓↓↓↓

原文  https://mp.weixin.qq.com/s?__biz=MzU4MDUyMDQyNQ==&mid=2247483723&idx=1&sn=4c95d3afa22ddcd02b9883c85cb77a6d&chksm=fd54d1cdca2358db97493ab5a97ab4d49a5633b74b0e897ac844032c4d75f75d253c1cc3e02d&token=593674992&lang=zh_CN
正文到此结束
Loading...