【技术】SpringBoot 自定义启动器,原来是这样的

10 篇文章 0 订阅

(一)Starter简介

SpringBoot 中的 Starter 是一种非常重要的机制,能够抛弃以前繁杂的配置,将其统一集成进 Starter ,应用者只需要在maven中引入Starter依赖,SpringBoot就能自动扫描到要加载的信息并启动相应的默认配置

Starter让我们摆脱了各种依赖库的处理,需要配置各种信息的困扰。SpringBoot 会自动通过 classpath 路径下的类发现需要的Bean,并注册进IOC容器。SpringBoot提供了针对日常企业应用研发各种场景的 spring-boot-starter 依赖模块。所有这些依赖模块都遵循着约定成俗的默认配置,并允许我们调整这些配置,即遵循==“约定大于配置”==的理念。

在我们的日常开发工作中,经常会有一些独立于业务之外的配置模块,我们经常将其放到一个特定的包下,然后如果另一个工程需要复用这块功能的时候,需要将代码硬拷贝到另一个工程,重新集成一遍,麻烦至极。如果我们将这些可独立于业务代码之外的功配置模块封装成一个个 Starter,复用的时候只需要将其在pom中引用依赖即可,SpringBoot为我们完成自动装配。

(二)创建自定义启动器

1、命名要求

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

官方建议自定义的 starter 使用 xxx-spring-boot-starter 命名规则。以区分 SpringBoot 生态提供的 starter。

2、自定义启动器

2.1 创建自定义Starter

2.1.1 新建 Maven 工程,按照官方命名要求命名,例如:demo-spring-boot-starter

2.1.2 导入自动配置依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
	<!-- 当前启动器的坐标地址,其他项目可以通过该坐标引入该启动器 -->
    <groupId>com.soft</groupId>
    <artifactId>diy-spring-boot-starter</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <!-- 导入自动配置依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-autoconfigure</artifactId>
            <version>2.5.4</version>
        </dependency>
    </dependencies>
</project>

2.1.3 编写对外使用对象

对外使用对象是自定义启动对对外暴露的对象,通过该对象可以完成某些需求

// 开启自动配置,使用 @ConfigurationProperties 时必须添加该注解
@EnableAutoConfiguration
// 属性赋值配置
@ConfigurationProperties(prefix = "diy")
public class DiyEntity {
    private String id;
    private String name;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "DiyEntity{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                '}';
    }
}

2.1.4 编写自动注入配置类

对外使用对象必须要有实例才能调用其功能。因为 SpringBoot 不推荐使用 xml 配置文件形式向容器注入对象,所以这里需要使用配置类向 Spring 容器中注入对象。

// 该注解标识当前类是一个配置类,配置类被加载时,@Bean 修饰的方法的返回值会自动注入到 Spring 容器中
@Configuration
public class DiyAutoConfiguration {

    // 将方法的返回值注入到 Spring 容器中
    @Bean
    public DiyEntity diyEntity(){
        return new DiyEntity();
    }
}

2.1.5 在resources 目录下创建 /META-INF/ 目录,并创建 spring.factories 文件

# SpringBoot 启动时会读取所有依赖下 /META-INF/spring.factories 文件,并根据 org.springframework.boot.autoconfigure.EnableAutoConfiguration 关键字获取对应配置类的全限定名称,依此来自动注入对象
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.soft.config.DiyAutoConfiguration

2.2 测试自定义启动器

2.2.1 在 SpringBoot 项目中添加自定义启动器依赖

<dependency>
    <groupId>com.soft</groupId>
    <artifactId>diy-spring-boot-starter</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>

2.2.2 注入自定义启动器暴露的对外对象

@Controller
@RequestMapping("/diy")
public class StudentController {
	// 注入自定义启动器暴露的对外对象
    @Resource
    DiyEntity diyEntity;

	@GetMapping("/")
    public String testDiyStarter(){
        System.out.println(diyEntity);
    }
}

2.2.3 通过配置文件给属性赋值

diy:
  id: 123
  name: tom

2.3 自定义启动器启动注解

通过以上配置即可完成自定义 Starter 的使用。在 SpringBoot 启动时自动注入对象,可直接使用。但,并不是所有的 Starter 都需要在 SpringBoot 启动后能直接使用,例如:定时任务、事务等启动器,在需要时开启。

2.3.1 创建标记类

标记类用于标识当前 Starter 是否需要被开启,仅仅是一个标记的作用,所以只需要定义类即可,也可以根据需求编写对应代码。

public class DiyConfigurationSelector{
}

2.3.2 创建开关注解

开关注解是写在 SpringBoot 启动类上,用于管理 Starter 的功能是否可用。

只管导入标记类,当前启动器是否可用它不管。

// Java元注解,标识当前注解使用的对象
@Target({ElementType.TYPE})
// Java元注解,标识当前注解使用的作用周期
@Retention(RetentionPolicy.RUNTIME)
// 导入标记类 DiyConfigurationSelector ,当 Spring 容器中该标记类对象时,即表示开启Starter
@Import(DiyConfigurationSelector.class)
public @interface EnableDiyServer {
}

2.3.3 改造自动注入配置类

条件注解,Spring 容器中有 DiyConfigurationSelector 实例时(标记类) 才会启用 Starter
@ConditionalOnBean(DiyConfigurationSelector.class) 它管的是 Starter 起不起作用

// 该注解标识当前类是一个配置类,配置类被加载时,@Bean 修饰的方法的返回值会自动注入到 Spring 容器中
@Configuration
// 条件注解,Spring 容器中有 DiyConfigurationSelector 实例时(标记类) 才会启用 Starter
@ConditionalOnBean(DiyConfigurationSelector.class)
public class DiyAutoConfiguration {

    // 将方法的返回值注入到 Spring 容器中
    @Bean
    public DiyEntity diyEntity(){
        return new DiyEntity();
    }
}

2.3.4 SpingBoot 启动类添加开关注解

@SpringBootApplication
@EnableDiyServer // 自定义启动器开关注解
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值