系列十七、理解SpringBoot中的starter & 自定义一个starter

一、概述

        作为后端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();
    }

}

3.1.4、application.yml

3.1.5、测试

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值