一、概述
作为后端Java程序员,基本上公司的日常开发都是基于SpringBoot进行的,我们使用SpringBoot也是沉醉于它的各种各样的starter带给我们的便利,这些starter为我们带来了众多的自动化配置,通过这些自动化配置,我们可以很容易地就可以搭建出一个生产级别的开发环境,那么starter到底是什么?它为什么这么神奇这么好用?接下来我会通过通俗易懂的语言 + 实战代码为大家介绍starter。
所谓starter其实就是各个组织或者公司,为了整合springboot而对外提供的一个组件,本质上就是一个普普通通的maven项目,例如:mybatis-plus-boot-starter、druid-spring-boot-starter、pagehelper-spring-boot-starter等,它的底层是由Spring + SpringMVC中的基础组件实现的,其核心注解是条件注解 @Conditional ,即:当classpath下符合某个条件该配置才会生效,例如:
二、自定义一个starter
2.1、步骤
1、新建一个普通的maven项目(pom中需引入springboot的自动配置);
2、创建一个HelloProperties类,用于接收application.yml或者application.properties中注入的值;
3、定义一个HelloService,用来处理接收到的值;
4、定义自动配置类;
5、在resources/META-INF目录创建一个spring.factories文件,将自定义的自动配置配置进取;
6、本地install后,再创建一个springboot工程,引入自定义的starter进行测试
2.2、案例
2.2.1、项目概览
2.2.2、pom
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
<version>2.1.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.18</version>
</dependency>
</dependencies>
2.2.3、HelloProperties
/**
* @Author : 一叶浮萍归大海
* @Date: 2023/12/2 11:00
* @Description: 创建一个 HelloProperties 类,用来接受 application.properties 中注入的值
*
* @ConfigurationProperties(prefix = "titanic"):
* 将application.properties或者application.yml中前缀为titanic的属性值自动注入到这个实例中
*/
@Data
@ConfigurationProperties(prefix = "titanic")
public class HelloProperties {
private static final String DEFAULT_NAME = "JACK";
private static final String DEFAULT_MESSAGE = "杰克";
private String name = DEFAULT_NAME;
private String message = DEFAULT_MESSAGE;
}
2.2.4、HelloService
/**
* @Author : 一叶浮萍归大海
* @Date: 2023/12/2 11:00
* @Description:
*
*/
@Data
public class HelloService {
/**
* 姓名
*/
private String name;
/**
* 问候语
*/
private String message;
public String sayHello() {
return name + ":" + message;
}
}
2.2.5、HelloServiceAutoConfiguration
/**
* @Author : 一叶浮萍归大海
* @Date: 2023/12/2 11:00
* @Description:
*
* @EnableConfigurationProperties(HelloProperties.class):使配置的@ConfigurationProperties(prefix = "titanic")生效,让配置的属性成功的进入bean
* @ConditionalOnClass(HelloService.class):表示当项目的classpath路径存在HelloService时,后面的配置才会生效
* 流程:
* 1、自动配置类中首先注入HelloProperties,用于接收在application.yml或application.properties中配置的相关数据;
* 2、提供一个HelloService实例,将HelloProperties中的值注入进去
*/
@Configuration
@EnableConfigurationProperties(HelloProperties.class)
@ConditionalOnClass(HelloService.class)
public class HelloServiceAutoConfiguration {
@Resource
private HelloProperties helloProperties;
@Bean
public HelloService helloService() {
HelloService helloService = new HelloService();
helloService.setName(helloProperties.getName());
helloService.setMessage(helloProperties.getMessage());
return helloService;
}
}
题外话:配置到此,我们自定义的自动化配置类就算配好了,但是要想让我们自定义的自动化配置类生效,还需要在resources/META-INF目录创建一个spring.factories文件,文件中的值如下,那么为什么配置spring.factories后,我们自定义的starter就生效了?这块就涉及到SpringBoot的自动配置原理了,请参考前面的文章 系列十三、SpringBoot的自动配置原理分析 这里不再赘述。
2.2.6、spring.factories
org.springframework.boot.autoconfigure.EnableAutoConfiguration=org.star.config.HelloServiceAutoConfiguration
2.2.7、安装到本地
三、测试
3.1、步骤
新建一个springboot项目,引入上述自定义的starter,在application.yml中配置相关信息进行测试即可!
3.1 、案例代码
3.1.1、项目概览
3.1.2、pom
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.star</groupId>
<artifactId>hello-spring-boot-starter</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
3.1.3、HelloController
/**
* @Author : 一叶浮萍归大海
* @Date: 2023/12/2 11:00
* @Description:
*/
@RestController
public class HelloController {
@Resource
private HelloService helloService;
@GetMapping("/sayHello")
public String sayHello() {
return helloService.sayHello();
}
}