SpringBoot 自定义starter

115 阅读4分钟

为什么要自定义starter

虽然 Spring Boot 已经提供了很多常用的 starter,但是有些特殊的需求可能并没有被满足。这时候,开发者就可以自定义自己的 starter 来满足这些特殊需求。以下是一些可能需要自定义 starter 的情况:

  1. 整合第三方库:有时候,我们需要整合一些第三方的库或者框架到 Spring 应用中。这时候,我们可以自定义一个 starter,将这个第三方库封装成一个 bean,然后在应用中使用。
  2. 优化常用配置:Spring Boot 虽然提供了很多默认的配置,但是有些情况下,我们需要对一些常用的配置进行优化。这时候,我们可以自定义一个 starter,对这些常用的配置进行封装和优化。
  3. 提供特殊功能:有时候,我们需要提供一些特殊的功能,例如日志收集、性能监控等。这时候,我们可以自定义一个 starter,将这些特殊的功能封装成一个 bean,然后在应用中使用。
  4. 简化配置:有时候,我们需要使用一些复杂的配置来启动 Spring 应用。这时候,我们可以自定义一个 starter,将这些复杂的配置封装成一个简单的配置方式,然后在应用中使用。

总的来说,自定义一个 starter 可以帮助我们简化应用的配置和开发过程,提高开发效率和应用性能。

命名规则

SpringBoot官方提供的starter以spring-boot-starter-xxx的方式命名

官方建议自定义的starter使用xxx-spring-boot-starter的方式命名。用以区分官方与三方。

实现

自定义starter,大致可以分为如下几步:

  1. 创建项目,在pom文件中引入autoconfigure
  2. 编写自己的代码
  3. 进行 META-INF/spring.factories 配置文件的编写,使得项目启动能加载指定的自动配置类

第三点,SpringBoot 2.7之后的有改动

1.创建项目并引入对应架包

在创建项目,设置artifactId时,记得遵守上文说到的命名规则。

引入自动配置包

 <dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-autoconfigure</artifactId>
 </dependency>

2 编写自己需要的代码

以下是简单的一个示例:

  • service包中的类:
 public class HelloService {
 ​
     @Autowired
     HelloProperties helloProperties;
 ​
     public String sayHello(String name){
         return  name + helloProperties.getName();
     }
 }

之所以不将其(HelloService)注入到容器中,是为了实现按需使用。可能你自定义的starter中有很多bean对象,但开发中可能不是每个都需要,于是我们将使用权交给使用者,关于它的配置我们交给自动配置类

  • Bean包中的配置类
 @ConfigurationProperties(prefix = "man.sugar")
 public class HelloProperties {
 ​
     @Value("loo")
     private String name;
 ​
     public String getName() {
         return name;
     }
 ​
     public void setName(String name) {
         this.name = name;
     }
 ​
 }

与配置文件中的值进行绑定。

  • Config包中的自动配置类
 @Configuration
 @EnableConfigurationProperties(HelloProperties.class)
 public class HelloServiceAutoConfiguration {
 ​
     @Bean
  // @ConditionalOnMissingBean ... 
     public HelloService helloService(){
         return new HelloService();
     }
 }

在创建bean组件的时候,可以按照自己的需求,通过@ConditionalXXxx定义一些条件,实现根据条件创建。条件可以放在类上,也可以放在方法上。

使用@EnableConfigurationProperties(HelloProperties.class) 会将HelloProperties放到容器中,因为HelloService的创建,需要该属性

  • 配置文件application.properties
 man.sugar.name = Drink plenty of water 

到此自定义starter基本实现完成,但还差最重要的一步。因为此时的自动配置类不会生效。根据自动配置原理可以了解到,我们还需要在配置META-INF/spring.factories文件中进行配置,这样才能使得项目在启动的时候加载指定的自动配置类

3 配置文件的编写

在项目的资源文件中创建META-INF/spring.factories,并对spring.factories进行编写,将需要自动加载的类写入配置

 # Auto Configure
 org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
 com.sugar.demo1.config.HelloServiceAutoConfiguration

配置自己的自动配置类路径

springboot在2.7及以后版本不推荐使用/META-INF/spring.factories文件,并且在Spring Boot 3将移除对/META-INF/spring.factories的支持。 新的写法是/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

 org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
 com.sugar.demo1.config.HelloServiceAutoConfiguration

使用自定义starter

在将之前项目通过maven进行install后,即可开始使用。

引入自定义的starter

  <dependency>
    <groupId>com.sugar.demo1</groupId>
    <artifactId>use-custom-starter</artifactId>
    <version>0.0.1-SNAPSHOT</version>
 </dependency>

成功引入后,即可在项目中使用对应的bean对象

 @RestController
 public class HepController {
 ​
     @Autowired
     HelloService helloService;
 ​
     @GetMapping("/hello")
     public String hello(){
         String sugar = helloService.sayHello("sugar");
         return "sth = "+sugar;
     }
 }

同时你也可以在配置文件中对helloService中的HelloProperties的值进行更改

 man.sugar.name=like water