Blogger Information
Blog 41
fans 0
comment 0
visits 25180
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
28【网摘】Spring Boot自定义starter
自由之上
Original
474 people have browsed it

starter 是 SpringBoot 中一种非常重要的机制,它可以繁杂的配置统一集成到 starter 中,我们只需要通过 maven 将 starter 依赖引入到项目中,SpringBoot 就能自动扫描并加载相应的默认配置。starter 的出现让开发人员从繁琐的框架配置中解放出来,将更多的精力专注于业务逻辑的开发,极大的提高了开发效率。

在一些特殊情况下,我们也可以将一些通用功能封装成自定义的 starter 进行使用,本节我们将为您详细介绍如何自定义 starter。

1、命名规范

SpringBoot 提供的 starter 以 spring-boot-starter-xxx 的形式命名。为了与 SpringBoot 生态提供的 starter 进行区分,官方建议第三方开发者或技术(例如 Druid、Mybatis 等等)厂商自定义的 starter 使用 xxx-spring-boot-starter 的形式命名,例如 mybatis-spring-boot-starter、druid-spring-boot-starter 等等。

2、模块规范

Spring Boot 官方建议我们在自定义 starter 时,创建两个 Module :autoConfigure Module 和 starter Module,其中 starter Module 依赖于 autoConfigure Module。
当然,这只是 Spring Boot 官方的建议,并不是硬性规定,若不需要自动配置代码和依赖项目分离,我们也可以将它们组合到同一个 Module 里。

3、自定义 starter

自定义 starter 可以分为以下 7 步:

  1. 创建工程
  2. 添加 POM 依赖
  3. 定义 propertie 类
  4. 定义 Service 类
  5. 定义配置类
  6. 创建 spring.factories文件
  7. 构建 starter

1、创建工程

1、使用 IntelliJ IDEA 创建一个空项目(Empty Project),如下图。

2、 在 Project Structure 界面,点击左上角的“+”按钮,选择“New Module”,
新建一个名为 bianchengbang-hello-spring-boot-starter 的 Maven Module 和一个名为 bianchengbang-helllo-spring-boot-starter-autoconfiguration 的 Spring Boot Module,如下图。

2、添加 POM 依赖

在 bianchengbang-hello-spring-boot-starter 的 pom.xml 中添加以下代码,将 bianchengbang-helllo-spring-boot-starter-autoconfiguration 作为其依赖项。

  1. <!--添加自动配置模块为其依赖-->
  2. <dependencies>
  3. <dependency>
  4. <groupId>net.biacheng.www</groupId>
  5. <artifactId>bianchengbang-helllo-spring-boot-starter-autoconfiguration</artifactId>
  6. <version>0.0.1-SNAPSHOT</version>
  7. </dependency>
  8. </dependencies>

3、定义 propertie 类

在 bianchengbang-helllo-spring-boot-starter-autoconfiguration 的 net.biacheng.www.properties 包中,创建一个实体类:HelloProperties,通过它来映射配置信息,其代码如下。

  1. package net.biacheng.www.properties;
  2. import org.springframework.boot.context.properties.ConfigurationProperties;
  3. /**
  4. * 实体类,用来映射配置信息
  5. */
  6. @ConfigurationProperties("net.biancheng.www.hello")
  7. public class HelloProperties {
  8. private String prefix;
  9. private String suffix;
  10. public String getPrefix() {
  11. return prefix;
  12. }
  13. public void setPrefix(String prefix) {
  14. this.prefix = prefix;
  15. }
  16. public String getSuffix() {
  17. return suffix;
  18. }
  19. public void setSuffix(String suffix) {
  20. this.suffix = suffix;
  21. }
  22. }

HelloProperties 类上使用了 @ConfigurationProperties(“net.biancheng.www.hello”),其含义是将该类中的属性与配置文件中的以 net.biancheng.www.hello 开头的配置进行绑定。

4、定义 Service 类

  1. package net.biacheng.www.service;
  2. import net.biacheng.www.properties.HelloProperties;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. /**
  5. * servcie 类,供外部调用
  6. */
  7. public class HelloService {
  8. @Autowired
  9. HelloProperties helloProperties;
  10. public String sayHello(String userName) {
  11. return helloProperties.getPrefix() + userName + helloProperties.getSuffix();
  12. }
  13. }

5、定义配置类

在 bianchengbang-helllo-spring-boot-starter-autoconfiguration 的 net.biacheng.www.autoConfiguration 中,创建一个配置类:HelloAutoConfiguration,其代码如下。

  1. package net.biacheng.www.autoConfiguration;
  2. import net.biacheng.www.properties.HelloProperties;
  3. import net.biacheng.www.service.HelloService;
  4. import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
  5. import org.springframework.boot.context.properties.EnableConfigurationProperties;
  6. import org.springframework.context.annotation.Bean;
  7. import org.springframework.context.annotation.Configuration;
  8. @Configuration
  9. @EnableConfigurationProperties(HelloProperties.class) //启用 HelloProperties,并默认将它添加到容器中
  10. public class HelloAutoConfiguration {
  11. @ConditionalOnMissingBean(HelloService.class) //当容器中没有 HelloService 时生效
  12. @Bean
  13. public HelloService helloService() {
  14. HelloService helloService = new HelloService();
  15. return helloService;
  16. }
  17. }

HelloAutoConfiguration 使用了以下 4 个注解:

  • @Configuration:表示该类是一个配置类;
  • @ConditionalOnMissingBean(HelloService.class):该注解表示当容器中没有 HelloService 类时,该方法才生效;
  • @Bean:该注解用于将方法的返回值以 Bean 对象的形式添加到容器中。

6、创建 spring.factories文件

由于 Spring Boot 的自动配置是基于 Spring Factories 机制实现的,因此我们自定义 starter 时,同样需要在项目类路径下创建一个 spring.factories 文件。

在 bianchengbang-helllo-spring-boot-starter-autoconfiguration 的类路径下(resources )中创建一个 META-INF 文件夹,并在 META-INF 文件夹中创建一个 spring.factories 文件,如下图。

将 Spring Boot 的 EnableAutoConfiguration 接口与自定义 starter 的自动配置类 HelloAutoConfiguration 组成一组键值对添加到 spring.factories 文件中,以方便 Spring Boot 在启动时,获取到自定义 starter 的自动配置,代码如下。

  1. org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  2. net.biacheng.www.autoConfiguration.HelloAutoConfiguration

Spring Factories 机制是 Spring Boot 中的一种服务发现机制,这种机制与 Java SPI 机制十分相似。Spring Boot 会自动扫描所有 Jar 包类路径下 META-INF/spring.factories 文件,并读取其中的内容,进行实例化,这种机制也是 Spring Boot Starter 的基础。

7、构建 starter

接下来,我们需要对自定义 starter 进行构建,并将它安装到本地仓库或远程仓库中,供其他项目使用。由于我们是在本地的项目中引用和测试,因此只需要使用 install 命令安装到本地仓库即可。

1、构建 autoConfigure Module

由于 starter Module 是依赖于 autoConfigure Module 的,因此我们需要先对 autoConfigure Module 进行构建。

在 bianchengbang-helllo-spring-boot-starter-autoconfiguration 的 pom.xml 中执行以下 mvn 命令,对它进行构建。

  1. mvn clean install

命令执行结果如下。

  1. [INFO] Scanning for projects...
  2. [INFO]
  3. [INFO] --< net.biacheng.www:bianchengbang-helllo-spring-boot-starter-autoconfiguration >--
  4. [INFO] Building bianchengbang-helllo-spring-boot-starter-autoconfiguration 0.0.1-SNAPSHOT
  5. [INFO] --------------------------------[ jar ]---------------------------------
  6. [INFO]
  7. [INFO] --- maven-clean-plugin:3.1.0:clean (default-clean) @ bianchengbang-helllo-spring-boot-starter-autoconfiguration ---
  8. [INFO] Deleting D:\IDEA\demo\spring-boot-my-starter\bianchengbang-helllo-spring-boot-starter-autoconfiguration\target
  9. [INFO]
  10. [INFO] --- maven-resources-plugin:3.2.0:resources (default-resources) @ bianchengbang-helllo-spring-boot-starter-autoconfiguration ---
  11. [INFO] Using 'UTF-8' encoding to copy filtered resources.
  12. [INFO] Using 'UTF-8' encoding to copy filtered properties files.
  13. [INFO] Copying 0 resource
  14. [INFO] Copying 1 resource
  15. [INFO]
  16. [INFO] --- maven-compiler-plugin:3.8.1:compile (default-compile) @ bianchengbang-helllo-spring-boot-starter-autoconfiguration ---
  17. [INFO] Changes detected - recompiling the module!
  18. [INFO] Compiling 3 source files to D:\IDEA\demo\spring-boot-my-starter\bianchengbang-helllo-spring-boot-starter-autoconfiguration\target\classes
  19. [INFO]
  20. [INFO] --- maven-resources-plugin:3.2.0:testResources (default-testResources) @ bianchengbang-helllo-spring-boot-starter-autoconfiguration ---
  21. [INFO] Using 'UTF-8' encoding to copy filtered resources.
  22. [INFO] Using 'UTF-8' encoding to copy filtered properties files.
  23. [INFO] skip non existing resourceDirectory D:\IDEA\demo\spring-boot-my-starter\bianchengbang-helllo-spring-boot-starter-autoconfiguration\src\test\resources
  24. [INFO]
  25. [INFO] --- maven-compiler-plugin:3.8.1:testCompile (default-testCompile) @ bianchengbang-helllo-spring-boot-starter-autoconfiguration ---
  26. [INFO] No sources to compile
  27. [INFO]
  28. [INFO] --- maven-surefire-plugin:2.22.2:test (default-test) @ bianchengbang-helllo-spring-boot-starter-autoconfiguration ---
  29. [INFO] No tests to run.
  30. [INFO]
  31. [INFO] --- maven-jar-plugin:3.2.0:jar (default-jar) @ bianchengbang-helllo-spring-boot-starter-autoconfiguration ---
  32. [INFO] Building jar: D:\IDEA\demo\spring-boot-my-starter\bianchengbang-helllo-spring-boot-starter-autoconfiguration\target\bianchengbang-helllo-spring-boot-starter-autoconfiguration-0.0.1-SNAPSHOT.jar
  33. [INFO]
  34. [INFO] --- maven-install-plugin:2.5.2:install (default-install) @ bianchengbang-helllo-spring-boot-starter-autoconfiguration ---
  35. [INFO] Installing D:\IDEA\demo\spring-boot-my-starter\bianchengbang-helllo-spring-boot-starter-autoconfiguration\target\bianchengbang-helllo-spring-boot-starter-autoconfiguration-0.0.1-SNAPSHOT.jar to D:\myRepository\repository\net\biacheng\www\bianchengbang-helllo-spring-boot-starter-autoconfiguration\0.0.1-SNAPSHOT\bianchengbang-helllo-spring-boot-starter-autoconfiguration-0.0.1-SNAPSHOT.jar
  36. [INFO] Installing D:\IDEA\demo\spring-boot-my-starter\bianchengbang-helllo-spring-boot-starter-autoconfiguration\pom.xml to D:\myRepository\repository\net\biacheng\www\bianchengbang-helllo-spring-boot-starter-autoconfiguration\0.0.1-SNAPSHOT\bianchengbang-helllo-spring-boot-starter-autoconfiguration-0.0.1-SNAPSHOT.pom
  37. [INFO] ------------------------------------------------------------------------
  38. [INFO] BUILD SUCCESS
  39. [INFO] ------------------------------------------------------------------------
  40. [INFO] Total time: 2.285 s
  41. [INFO] Finished at: 2021-07-05T09:59:11+08:00
  42. [INFO] ------------------------------------------------------------------------

2、构建 starter Module

在 autoConfigure Module 构建完成后,接下来我们就可以对 starter Module 进行构建,构建完成后,其他 Spring Boot 项目便可以引用该自定义 starter 了。

在 bianchengbang-hello-spring-boot-starter 的 pom.xml 中执行以下 mvn 命令,对它进行构建。

  1. mvn clean install

命令执行结果如下。

  1. [INFO] Scanning for projects...
  2. [INFO]
  3. [INFO] --< net.biacheng.www:bianchengbang-helllo-spring-boot-starter-autoconfiguration >--
  4. [INFO] Building bianchengbang-helllo-spring-boot-starter-autoconfiguration 0.0.1-SNAPSHOT
  5. [INFO] --------------------------------[ jar ]---------------------------------
  6. [INFO]
  7. [INFO] --- maven-clean-plugin:3.1.0:clean (default-clean) @ bianchengbang-helllo-spring-boot-starter-autoconfiguration ---
  8. [INFO] Deleting D:\IDEA\demo\spring-boot-my-starter\bianchengbang-helllo-spring-boot-starter-autoconfiguration\target
  9. [INFO]
  10. [INFO] --- maven-resources-plugin:3.2.0:resources (default-resources) @ bianchengbang-helllo-spring-boot-starter-autoconfiguration ---
  11. [INFO] Using 'UTF-8' encoding to copy filtered resources.
  12. [INFO] Using 'UTF-8' encoding to copy filtered properties files.
  13. [INFO] Copying 0 resource
  14. [INFO] Copying 1 resource
  15. [INFO]
  16. [INFO] --- maven-compiler-plugin:3.8.1:compile (default-compile) @ bianchengbang-helllo-spring-boot-starter-autoconfiguration ---
  17. [INFO] Changes detected - recompiling the module!
  18. [INFO] Compiling 3 source files to D:\IDEA\demo\spring-boot-my-starter\bianchengbang-helllo-spring-boot-starter-autoconfiguration\target\classes
  19. [INFO]
  20. [INFO] --- maven-resources-plugin:3.2.0:testResources (default-testResources) @ bianchengbang-helllo-spring-boot-starter-autoconfiguration ---
  21. [INFO] Using 'UTF-8' encoding to copy filtered resources.
  22. [INFO] Using 'UTF-8' encoding to copy filtered properties files.
  23. [INFO] skip non existing resourceDirectory D:\IDEA\demo\spring-boot-my-starter\bianchengbang-helllo-spring-boot-starter-autoconfiguration\src\test\resources
  24. [INFO]
  25. [INFO] --- maven-compiler-plugin:3.8.1:testCompile (default-testCompile) @ bianchengbang-helllo-spring-boot-starter-autoconfiguration ---
  26. [INFO] No sources to compile
  27. [INFO]
  28. [INFO] --- maven-surefire-plugin:2.22.2:test (default-test) @ bianchengbang-helllo-spring-boot-starter-autoconfiguration ---
  29. [INFO] No tests to run.
  30. [INFO]
  31. [INFO] --- maven-jar-plugin:3.2.0:jar (default-jar) @ bianchengbang-helllo-spring-boot-starter-autoconfiguration ---
  32. [INFO] Building jar: D:\IDEA\demo\spring-boot-my-starter\bianchengbang-helllo-spring-boot-starter-autoconfiguration\target\bianchengbang-helllo-spring-boot-starter-autoconfiguration-0.0.1-SNAPSHOT.jar
  33. [INFO]
  34. [INFO] --- maven-install-plugin:2.5.2:install (default-install) @ bianchengbang-helllo-spring-boot-starter-autoconfiguration ---
  35. [INFO] Installing D:\IDEA\demo\spring-boot-my-starter\bianchengbang-helllo-spring-boot-starter-autoconfiguration\target\bianchengbang-helllo-spring-boot-starter-autoconfiguration-0.0.1-SNAPSHOT.jar to D:\myRepository\repository\net\biacheng\www\bianchengbang-helllo-spring-boot-starter-autoconfiguration\0.0.1-SNAPSHOT\bianchengbang-helllo-spring-boot-starter-autoconfiguration-0.0.1-SNAPSHOT.jar
  36. [INFO] Installing D:\IDEA\demo\spring-boot-my-starter\bianchengbang-helllo-spring-boot-starter-autoconfiguration\pom.xml to D:\myRepository\repository\net\biacheng\www\bianchengbang-helllo-spring-boot-starter-autoconfiguration\0.0.1-SNAPSHOT\bianchengbang-helllo-spring-boot-starter-autoconfiguration-0.0.1-SNAPSHOT.pom
  37. [INFO] ------------------------------------------------------------------------
  38. [INFO] BUILD SUCCESS
  39. [INFO] ------------------------------------------------------------------------
  40. [INFO] Total time: 2.257 s
  41. [INFO] Finished at: 2021-07-05T10:06:44+08:00
  42. [INFO] ------------------------------------------------------------------------

当引用自定义 starter 的项目不在本地时,我们需要使用 mvn 命令“mvn clean deploy”将自定义 starter 部署到远程仓库中。

4、测试

1、创建一个名为 test-my-starter 的 Spring Boot 项目,并在其 pom.xml 中引入依赖 bianchengbang-hello-spring-boot-starter(自定义 starter),代码如下。

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <parent>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-parent</artifactId>
  8. <version>2.5.2</version>
  9. <relativePath/> <!-- lookup parent from repository -->
  10. </parent>
  11. <groupId>net.biacheng.www</groupId>
  12. <artifactId>test-my-starter</artifactId>
  13. <version>0.0.1-SNAPSHOT</version>
  14. <name>test-my-starter</name>
  15. <description>Demo project for Spring Boot</description>
  16. <properties>
  17. <java.version>1.8</java.version>
  18. </properties>
  19. <dependencies>
  20. <!--引入 web 功能的 starter-->
  21. <dependency>
  22. <groupId>org.springframework.boot</groupId>
  23. <artifactId>spring-boot-starter-web</artifactId>
  24. </dependency>
  25. <!--引入测试 starter-->
  26. <dependency>
  27. <groupId>org.springframework.boot</groupId>
  28. <artifactId>spring-boot-starter-test</artifactId>
  29. <scope>test</scope>
  30. </dependency>
  31. <!--引入自定义 starter -->
  32. <dependency>
  33. <groupId>net.biancheng.www</groupId>
  34. <artifactId>bianchengbang-hello-spring-boot-starter</artifactId>
  35. <version>1.0-SNAPSHOT</version>
  36. </dependency>
  37. </dependencies>
  38. <build>
  39. <plugins>
  40. <plugin>
  41. <groupId>org.springframework.boot</groupId>
  42. <artifactId>spring-boot-maven-plugin</artifactId>
  43. </plugin>
  44. </plugins>
  45. </build>
  46. </project>

2、在 Spring Boot 配置文件 application.properties 中,添加以下属性配置。

  1. #自定义 starter prefix 属性
  2. net.biancheng.www.hello.prefix=你好:
  3. #自定义 starter suffix 属性
  4. net.biancheng.www.hello.suffix=,欢迎您来到编程帮!

3、在 net.biancheng.www.controller 中创建一个控制器类 HelloController,代码如下。

  1. package net.biacheng.www.controller;
  2. import net.biacheng.www.service.HelloService;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.stereotype.Controller;
  5. import org.springframework.web.bind.annotation.GetMapping;
  6. import org.springframework.web.bind.annotation.ResponseBody;
  7. @Controller
  8. public class HelloController {
  9. //自动装配自定义 starter 的 service
  10. @Autowired
  11. HelloService helloService;
  12. @ResponseBody
  13. @GetMapping("/hello")
  14. public String SayHello(String name) {
  15. return helloService.sayHello(name);
  16. }
  17. }

4、启动 Spring Boot,使用浏览器访问“http://localhost:8080/hello?name=小明”,结果如下图。

图2:访问结果

可以看到,我们自定义的 starter 已经生效。


加入
QQ群:722461036
微信群:
一起督促、学习、练习、温习、复习 ~ ~ ~

Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!