SpringBoot定制化Starter实现方法

让我详细讲解SpringBoot定制化Starter实现方法的完整攻略。

什么是 SpringBoot Starter

SpringBoot Starter 是一个提供很多开箱即用功能的集成包(或者说是依赖包)。通常情况下,我们只需要引入这个 Starter,配置一下参数即可,相关的依赖和配置都已经自动完成了。

SpringBoot Starter 的作用

SpringBoot Starter 的作用是帮助我们快速地集成第三方库的依赖,开发者可以更加专注业务逻辑的实现而不必关心配置实现。

SpringBoot Starter 的实现方法

首先,创建一个 SpringBoot 项目,然后定义自己的 Starter,要完成以下步骤:

  1. 定义 Starter

定义 Starter 的类要实现 org.springframework.context.ApplicationContextInitializer 接口。它需要的主要是 做一些初始化的工作。以下为定义 Starter 的示例代码:

public class MyStarterInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
    @Override
    public void initialize(ConfigurableApplicationContext applicationContext) {
        // 打印日志
        System.out.println("My starter is initializing...");
    }
}
  1. 定制化 Starter

经过了第一步,我们已经可以创建一个 Starter 了。接下来就是如何让用户使用这个 Starter,并能够通过配置来更改 Starter 的默认行为。

我们需要在项目中定义一个类,来完成以下任务:

  • 继承 org.springframework.boot.autoconfigure.condition.ConditionalOnProperty 接口,指定这个 Starter 的实现需要基于某个配置。

  • 继承 org.springframework.boot.autoconfigure.EnableAutoConfiguration 接口,且将这个 Starter 作为参数传入构造方法中。

  • 创建一个配置类,定义 Starter 相关的配置项。

示例代码如下:

@Configuration
@ConditionalOnProperty(prefix = "my.starter", name = "enabled", havingValue = "true", matchIfMissing = true) // 只有当 my.starter.enabled 配置为 true 时,才启用 Starter
@EnableConfigurationProperties(MyStarterProperties.class) // 启用配置类
public class MyStarterAutoConfiguration {

    private MyStarterProperties myStarterProperties;

    MyStarterAutoConfiguration(MyStarterProperties myStarterProperties) {
        this.myStarterProperties = myStarterProperties;
    }

    @Bean
    public MyStarter myStarter() {
        return new MyStarter(myStarterProperties.getName()); // 返回自定义的 Starter 实例
    }

}

@ConfigurationProperties(prefix = "spring.my.starter") // 指定配置项的前缀,用于与 Starter 相关的属性定义
public class MyStarterProperties {

    private String name = "my starter name"; // 设置默认值

    public String getName() {
        return name;
    }

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

}

在以上示例代码中,我们定义了一个前缀为 my.starter 的配置项。我们使用 @ConditionalOnProperty 注解来制定这个 Starter 仅在 my.starter 配置项的 enabled 属性都为 true 时,才会生效。默认情况下,我们定义为 true。

示例1:自定义 Starter

例如我们要开发一个 Starter,这个 Starter 的功能是在系统启动时打印一段信息给用户。我们定义一个 HelloWorldStarter,并在启动时输出 "Hello, World!"。

首先,定义 Starter :

public class HelloWorldStarter implements ApplicationContextInitializer<ConfigurableApplicationContext> {

    @Override
    public void initialize(ConfigurableApplicationContext applicationContext) {
        System.out.println("Hello, World!");
    }

}

然后,定义 Starter AutoConfiguration:

@Configuration
@EnableConfigurationProperties(HelloWorldProperties.class)
@ConditionalOnProperty(
        prefix = "spring.hello",
        name = "enabled",
        havingValue = "true",
        matchIfMissing = true
)
public class HelloWorldAutoConfiguration {

    private final HelloWorldProperties props;

    public HelloWorldAutoConfiguration(HelloWorldProperties props) {
        this.props = props;
    }

    @Bean
    public HelloWorldStarter helloWorldStarter() {
        return new HelloWorldStarter();
    }

}

接着,定义 Starter Properties:

@ConfigurationProperties(prefix = "spring.hello")
public class HelloWorldProperties {

    private boolean enabled = true;
    private String msg = "default message";

    public boolean isEnabled() {
        return enabled;
    }

    public void setEnabled(boolean enabled) {
        this.enabled = enabled;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

}

这个 Starter 就完成了,如果在应用启动时配置了 "spring.hello.enabled=true" 的话,将会打印 "Hello, World!" 消息。

示例2:扩展 Spring Data Elasticsearch

此示例演示如何通过自定义 Starter 扩展 Spring Data Elasticsearch 的功能。下面的 Starter 可以让系统启动时创建一个 Elasticsearch 的 index。

首先,定义 Starter:

public class ElasticsearchStarter implements InitializingBean {

    private final ElasticsearchOperations elasticsearchOperations;

    public ElasticsearchStarter(ElasticsearchOperations elasticsearchOperations) {
        this.elasticsearchOperations = elasticsearchOperations;
    }

    @Override
    public void afterPropertiesSet() {
        final String indexName = "my_index"; // 定义 index 名称
        IndexOperations indexOperations = this.elasticsearchOperations.indexOps(indexName);
        if (!indexOperations.exists() && indexOperations.create()) { // 当不存在 index 时创建
            System.out.println("Index [" + indexName + "] is created.");
        }
    }

}

然后,定义 Starter AutoConfiguration:

@Configuration
@EnableConfigurationProperties(ElasticsearchProperties.class)
@ConditionalOnProperty(
        prefix = "spring.data.elasticsearch",
        name = {"host","port"},
        matchIfMissing = false
)
public class ElasticsearchAutoConfiguration {

    private final ElasticsearchProperties props;

    public ElasticsearchAutoConfiguration(ElasticsearchProperties props) {
        this.props = props;
    }

    @Bean
    public ElasticsearchStarter elasticsearchStarter(ElasticsearchOperations elasticsearchOperations) {
        return new ElasticsearchStarter(elasticsearchOperations);
    }

}

最后,定义 Starter Properties:

@ConfigurationProperties(prefix = "spring.data.elasticsearch")
public class ElasticsearchProperties {

    private String host;
    private int port;

    public String getHost() {
        return host;
    }

    public void setHost(String host) {
        this.host = host;
    }

    public int getPort() {
        return port;
    }

    public void setPort(int port) {
        this.port = port;
    }

}

这个 Starter 就完成了,如果用户配置了 spring.data.elasticsearch.hostspring.data.elasticsearch.port 两个属性,应用启动后将会根据 Starter 的定义创建一个 index。

总结

通过以上的两个示例,我们可以看到 SpringBoot Starter 的强大兼容性和封装性:在 Starter 启动时,会检查用户定义的配置项,从而确定哪些 Starter 是需要生效的。
最后,我们通过以上的实现方法,可以定制化自己的 Starter。同时,Spring Boot Starter 对于第三方库的依赖集成提供了很好的解决方案,省略了引用的繁琐过程。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot定制化Starter实现方法 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • spring事务传播的Propagation.REQUIRES_NEW以及NEVER MANDATORY验证,及其失效的诡异问题

    NEVER 不使用事务,如果当前事务存在,则抛出异常 验证: @Service public class PrService { @Autowired PrDao dao; @Transactional public void savea() { dao.a();//保存第一条数据 saveb(); } @Transactional(propagation …

    Java 2023年5月8日
    00
  • JFreeChart插件实现的折线图效果实例

    下面我将详细讲解“JFreeChart插件实现的折线图效果实例”的完整攻略。 简介 JFreeChart是一款专门用于绘制各种类型图表的Java图表库,该库提供了各种类型的图表,包括折线图、饼状图、柱状图、散点图等。在本篇文章中,我们将会详细讲解如何使用JFreeChart插件实现一个简单的折线图效果实例。 实现步骤 以下是我们在使用JFreeChart插件…

    Java 2023年6月15日
    00
  • Java jwt使用公钥字符串验证解析token锁方法详解

    Java JWT使用公钥字符串验证解析token方法详解 JSON Web Token (JWT) 是一种用于 Web 应用程序处理身份验证的开放标准(RFC 7519),可在不同站点或服务器之间安全地传输声明,泛指声明某个实体(主体)具有某个权限。 本文将介绍如何使用公钥字符串来验证和解析 JWT 令牌,以此保证您的 Web 应用程序的身份验证机制的安全性…

    Java 2023年5月20日
    00
  • Java窗口精细全方位讲解

    Java窗口精细全方位讲解 简介 本篇攻略将完整讲解如何用Java语言创建窗口并增加各种控件,包括文本框、按钮、下拉框等等,并讲解如何实现它们的交互功能。 准备工作 在开始编程前,你需要安装Java开发工具包(JDK)和一个编译器,比如Eclipse或者IntelliJ IDEA。这里我们以Eclipse为例。 创建窗口 要创建窗口,我们需要创建一个新的Ja…

    Java 2023年5月23日
    00
  • java如何导出insert语句并生成sql脚本

    要导出insert语句并生成sql脚本,我们可以使用Java中的JDBC(Java Database Connectivity)连接数据库并操作数据库。下面是详细的步骤: 加载数据库驱动。 首先需要加载对应的数据库驱动,这里以MySQL数据库为例,使用JDBC驱动名为com.mysql.jdbc.Driver。 Class.forName("com…

    Java 2023年5月20日
    00
  • SpringBoot整合log4j日志与HashMap的底层原理解析

    SpringBoot整合log4j日志与HashMap的底层原理解析 1. 准备工作 在开始整合log4j日志与HashMap之前,需要先完成以下准备工作: 确保已经安装好相应版本的jdk、Maven工具和SpringBoot框架。 创建一个空的SpringBoot应用程序,可以使用Spring Initializr等工具或者手动创建项目。 2. 添加依赖 …

    Java 2023年5月20日
    00
  • Netty分布式固定长度解码器实现原理剖析

    Netty分布式固定长度解码器实现原理剖析 什么是Netty分布式固定长度解码器 Netty是一个开源、高性能、异步事件驱动的网络应用框架。在Netty中,解码器是十分重要的一部分,它们负责将字节流解析为Java对象。 Netty分布式固定长度解码器,顾名思义,是一种针对分布式系统应用的固定长度数据解码器。 Netty分布式固定长度解码器的实现原理 Nett…

    Java 2023年5月20日
    00
  • Java实现学生管理系统(IO版)

    Java实现学生管理系统(IO版)攻略 简介 本文将介绍如何使用Java语言实现学生管理系统,使用的是Java中的IO流处理方式,实现添加学生信息、查询学生信息、删除学生信息、修改学生信息等功能。 实现步骤 1.创建项目 首先,我们需要创建一个Java项目,可以使用Eclipse或者其他Java开发工具。 2.创建类和文件 在src目录下创建”com.stu…

    Java 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部