自定义starter
# 自定义starter
# 为什么要自定义starter
虽然 Spring Boot 已经提供了很多常用的 starter,但是有些特殊的需求可能并没有被满足。这时候,开发者就可以自定义自己的 starter 来满足这些特殊需求。以下是一些可能需要自定义 starter 的情况:
- 整合第三方库:有时候,我们需要整合一些第三方的库或者框架到 Spring 应用中。这时候,我们可以自定义一个 starter,将这个第三方库封装成一个 bean,然后在应用中使用。
- 优化常用配置:Spring Boot 虽然提供了很多默认的配置,但是有些情况下,我们需要对一些常用的配置进行优化。这时候,我们可以自定义一个 starter,对这些常用的配置进行封装和优化。
- 提供特殊功能:有时候,我们需要提供一些特殊的功能,例如日志收集、性能监控等。这时候,我们可以自定义一个 starter,将这些特殊的功能封装成一个 bean,然后在应用中使用。
- 简化配置:有时候,我们需要使用一些复杂的配置来启动 Spring 应用。这时候,我们可以自定义一个 starter,将这些复杂的配置封装成一个简单的配置方式,然后在应用中使用。
总的来说,自定义一个 starter 可以帮助我们简化应用的配置和开发过程,提高开发效率和应用性能。
# 命名规则
SpringBoot官方提供的starter以spring-boot-starter-xxx
的方式命名
官方建议自定义的starter使用xxx-spring-boot-starter
的方式命名。用以区分官方与三方。
# 实现
自定义starter,大致可以分为如下几步:
- 创建项目,在pom文件中引入
autoconfigure
包 - 编写自己的代码
- 进行 META-INF/spring.factories 配置文件的编写,使得项目启动能加载指定的自动配置类
第三点,SpringBoot 2.7之后的有改动
# 1.创建项目并引入对应架包
在创建项目,设置artifactId
时,记得遵守上文说到的命名规则。
引入自动配置包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
</dependency>
2
3
4
# 2 编写自己需要的代码
以下是简单的一个示例:
- service包中的类:
public class HelloService {
@Autowired
HelloProperties helloProperties;
public String sayHello(String name){
return name + helloProperties.getName();
}
}
2
3
4
5
6
7
8
9
之所以不将其(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;
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
与配置文件中的值进行绑定。
- Config包中的自动配置类
@Configuration
@EnableConfigurationProperties(HelloProperties.class)
public class HelloServiceAutoConfiguration {
@Bean
// @ConditionalOnMissingBean ...
public HelloService helloService(){
return new HelloService();
}
}
2
3
4
5
6
7
8
9
10
在创建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
2
3
配置自己的自动配置类路径
提示
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
2
# 使用自定义starter
在将之前项目通过maven进行install后,即可开始使用。
# 引入自定义的starter
<dependency>
<groupId>com.sugar.demo1</groupId>
<artifactId>use-custom-starter</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
2
3
4
5
成功引入后,即可在项目中使用对应的bean对象
@RestController
public class HepController {
@Autowired
HelloService helloService;
@GetMapping("/hello")
public String hello(){
String sugar = helloService.sayHello("sugar");
return "sth = "+sugar;
}
}
2
3
4
5
6
7
8
9
10
11
12
同时你也可以在配置文件中对helloService中的HelloProperties的值进行更改
man.sugar.name=like water