SpringBoot的重要内容:自定义Starter

442 阅读4分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第6天,点击查看活动详情

1、自定义Starter

自定义Starter是学习SpringBoot不可缺少的一环,借用一句前辈说过的话:学SpringBoot不会自定义Starter等于没学。这也在一定程度上说明了,会自定义Starter则必定要对SpringBoot的自动配置及运行原理有自己的理解,并能在实践中使用。

1.1、什么是Starter?

将一系列服务封装成一个starter,使用该服务时直接引入对应的starter即可,该starter会自动配置完成该服务需要的基础配置,开箱即用。先看两个常用的依赖:

上述两种图就清晰的表示了Starter的使用,开箱即用,导入对应的Starter即可使用相应的服务;

Starter,是“一站式服务(onestop)”的依赖 Jar 包:

  • 包含Spring 以及相关技术(比如 Redis)的所有依赖
  • 提供了自动配置的功能,开箱即用
  • 提供了良好的依赖管理,避免了包遗漏、版本冲突等问题

1.2、Starter结构

Redis Starter示例:

Maven可选依赖说明:

1.3、自定义Starter实例

1.3.1、应用场景

1.3.2、创建流程(源码见Gitee)

1.3.2.1、创建用户微服务

首先创建一个maven项目 ms-user ,作为用户微服务的项目,它向外提供和用户相关的接口。

接着在项目ms-user中,新建一个模块ms-user-web,他是用户微服务的web应用,基于SpringBoot、SpringMVC、SpringCloud进行开发。

然后,新建一个模块ms-user-api,它里面包含了向外发布的HTTP接口和相关的参数与返回类型。

然后创建一个自动配置的模块,创建一个自动配置类,并使用注解@Configuration和@

EnableFeignClients修饰。

接着,定义一个starter模块,这是一个空模块,只有一个pom文件,通常是为了管理依赖。

最后使用maven的install命令对ms-user-spring-boot-starter编译、打包,得到一个ms-user-spring-boot-starter的jar包。

1.3.2.2、创建营销微服务

这里创建营销微服务调用用户微服务程序提供的和用户相关的服务,通常微服务程序部署在不同的主机上,然后可以通过http协议调用提供微服务的程序接口,获得相应服务(这就意味着用户微服务程序和营销微服务程序必须同时运行,这样才能够调用相应的微服务程序),这里通过OpenFeign实现。

首先,新建一个营销微服务maven项目 ms-marketing,并导入相关依赖。

接着,创建营销微服务子模块,并导入相关依赖。

然后,注入FeignClient客户端,即可调用FeignClient提供的服务,此时并未使用ms-user-spring-boot-starter,而是使用直接导入的ms-user-api模块,服务同样可以使用。

然后,将模块ms-user-api替换为ms-user-spring-boot-starter依赖,则会报错,如下:

这就需要在ms-user-autoconfigure中添加自动配置文件,如下。

至此,自定义starter以及使用自定义starter就已经完成了。

1.3.2.3、拓展

测试熔断器的功能,初始时会报错,这是因为ms-marketing-web只会扫描当前项目的package,此时需要在ms-user-autoconfigure的自动配置类MsUserAutoConfiguration中使用@Import注解导入@Import({UserFeignClient.UserFallbackFactory.class})用于熔断处理的类,并且在ms-marketing-web的启动类上添加@ComponentScan(basePackageClasses = UserFeignMarker.class),程序能运行,但无法访问 http://localhost:12080/hello/10001

1.3.3、SpringCloud OpenFeign补充

SpringCloud OpenFeign是向外提供微服务接口,实现了OpenFeign所在的微服务程序,其实就是利用动态代理加载相应的OpenFeign实现类(通常是Controller),并调用该实现类提供的http接口来完成服务调用。

SpringCloud OpenFeign的简单使用

1.3.4、注解处理器

SpringBoot中的注解处理器

注解处理器: 在编译阶段,生成指定注解的元数据

  • spring-boot-configuration-processor
  • spring-boot-autoconfigure-processor

spring-boot-configuration-processor

能够使IDE进行自动提示。

spring-boot-autoconfigure-processor

使SpringBoot项目启动时能够快速地过滤掉不符合条件的自动配置类,加快启动速度。

1.4、Starter总结

Starter通常是一个空的jar包,用来对依赖进行集中管理。

模块 ms-user-spring-boot-starter

  • 通常是一个空的 Jar 包
  • 对依赖进行集中管理:
    • 必要的 SpringBoot 核心 starter
    • ms-user-autoconfigure 模块
    • ms-user-api 模块

模块 ms-user-autoconfigure

  • 自动配置的核心模块,主要包括
    • 自动配置类;
    • spring.factories 配置文件;
    • 所需的配置项(通过注解 @EnableConfigurationProperties 和@ConfigurationProperties 来实现,从application.yml文件中读取数据,并注入到IOC容器中;)
  • 值得注意:它可选依赖于 ms-user-api;

实现Starter时建议加入以下两个注解处理器。

参考

www.bilibili.com/video/BV1NY…