springboot自定义starter示例代码

 更新时间:2024年11月07日 16:40:48   作者:阿胜yss  
SpringBoot自定义Starter项目的命名建议遵循xxx-spring-boot-starter格式,以避免与官方或第三方Starter产生冲突,核心规范包括自动装配文件的配置,旨在通过spring.factories或spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

springboot 约定规范

Starter项目的命名规范

建议自定义的starter 以 xxx-spring-boot-starter 命名,官方的Starter一般都是以spring-boot-starter-为前缀。

这样做的目的是为了避免与官方或其他第三方提供的Starter产生冲突或混淆。

Starter项目的结构规范(重要)

最核心的是 Spring Boot自动装配文件

作用: 用来指定我们的自动配置类,让Spring Boot能够在启动时自动扫描并加载它。

名称必须为 spring.factories

路径必须为resources/META-INF/spring.factories 这是springboot的约定规范,不遵守一律失效。

  • 1、在spring boot2.7版本之前:

通过META-INF/spring.factories文件定义我们自动配置的类。

  • 2、在spring boot2.7~spring boot3.0版本之间,是兼容了

META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 和META-INF/spring.factories 这两个文件的。

  • 3、在spring boot3.0版本之后,只支持使用

META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports来自定义我们的自动配置的类。

注意!!!:springboot 2.7 版本有所变化,具体请查看springboot官网。

  • hello-spring-boot-starter

pom.xml

依赖说明

  • spring-boot-configuration-processor : 编译时依赖 可以帮助我们生成属性类和配置元数据,并且设置为可选依赖,避免传递给其他项目。
  • spring-boot-starter : 基础依赖 提供了Spring Boot核心功能和默认配置
<?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>org.example</groupId>
    <artifactId>hello-spring-boot-starter</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <!--        jdk版本-->
        <java.version>1.8</java.version>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>
        <!-- 基础依赖  提供了Spring Boot核心功能和默认配置 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <version>2.7.18</version>
        </dependency>
        <!-- 编译时依赖 可以帮助我们生成属性类和配置元数据,并且设置为可选依赖,避免传递给其他项目。-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <version>2.7.18</version>
            <optional>true</optional>
        </dependency>
    </dependencies>
</project>

Starter项目的属性类

在创建一个自定义的Starter项目时,我们需要编写一个属性类,用来定义我们要集成的功能模块所需的配置项,并且使用@ConfigurationProperties注解来指定用户配置文件中的前缀。

package com.hello.starter.properties;

/**
 *  * 描述:配置信息 实体
 * @author yss
 * @date 2024/5/1
 */
import org.springframework.boot.context.properties.ConfigurationProperties;
@ConfigurationProperties(prefix = "demo") // 指定 用户配置文件中的前缀
public class DemoProperties {
    private String sayWhat;
    private String toWho;

    public String getSayWhat() {
        return sayWhat;
    }

    public void setSayWhat(String sayWhat) {
        this.sayWhat = sayWhat;
    }

    public String getToWho() {
        return toWho;
    }

    public void setToWho(String toWho) {
        this.toWho = toWho;
    }
}

Starter项目的业务功能类

在创建一个自定义的Starter项目时,我们需要编写一个或多个业务功能类,用来实现我们要集成的功能模块的具体逻辑。

package com.hello.starter.service;

/**
 * @author yss
 * @date 2024/5/1
 */
public class DemoService {
    public String sayWhat;
    public String toWho;
    public DemoService(String sayWhat, String toWho){
        this.sayWhat = sayWhat;
        this.toWho = toWho;
    }
    public String say(){
        return this.sayWhat + "!  " + toWho;
    }
}

Starter项目的自动配置类(重要)

在创建一个自定义的Starter项目时,我们需要编写一个自动配置类,用来根据属性类和业务功能类,创建相应的Bean对象。Springboot自动配置原理源码解读

  • @EnableConfigurationProperties : 启用属性类,并将其注入到配置类中。
  • @ConditionalOnProperty: 判断用户配置文件中是否有相应的配置项,存在并且符合期望则满足条件
  • @Configuration : 标识这是一个配置类,用来创建和注册Bean对象。
  • @Bean: 根据属性类和业务功能类,创建相应类型的Bean对象,并注册到应用上下文中。
  • @ConditionalOnClass: 判断业务功能类是否存在
package com.hello.starter.config;

import com.hello.starter.properties.DemoProperties;
import com.hello.starter.service.DemoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author yss
 * @date 2024/5/1
 */
@Configuration // 标识这是一个配置类,用来创建和注册Bean对象。
//启用属性类,并将其注入到配置类中。
@EnableConfigurationProperties(DemoProperties.class) 
// 判断业务功能类是否存在
@ConditionalOnClass(DemoService.class)
// 判断用户配置文件中是否存在指定的属性(isopen),
// 如果存在并且值与期望相符, 则满足条件(开启相应功能)。
@ConditionalOnProperty(
        prefix = "demo",
        name = "isopen",
        havingValue = "true"
)  
public class DemoConfig {
    @Autowired
    private DemoProperties demoProperties;
    
	// 根据属性类和业务功能类,创建相应类型的Bean对象,并注册到应用上下文中。
    @Bean(name = "demo")  
    public DemoService demoService(){
        return new DemoService(demoProperties.getSayWhat(), 
        demoProperties.getToWho());
    }
}

Starter项目的自动装配文件(重要)

在resources/META-INF目录下创建一个名为spring.factories的文件,用来指定我们的自动配置类,让Spring Boot能够在启动时自动扫描并加载它。

以下是一个示例:

#-------starter自动装配---------
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.hello.starter.config.DemoConfig

打包发布

执行 mvn clean install 命令 一个自定义的starter就完成了。

做完上面这几步,我们自定义Starter就完成了,下面我们来测试一下

引入依赖

在我们需要的项目中引入依赖。

<!--        自定义Starter-->
<dependency>
    <groupId>org.example</groupId>
    <artifactId>hello-spring-boot-starter</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>

  • application.yml
demo:
  # 允许 demo作为bean注入IOC容器  一定要指明 isopen  不然项目无法启动
  isopen: true
  say-what: hello
  to-who: shf
  • DemoController.java
package com.example.testStarter;

import com.hello.starter.service.DemoService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

/**
 * @author yss
 * @date 2024/5/1
 */
@RestController
public class DemoController {

    @Resource(name = "demo")
    private DemoService demoService;

    @RequestMapping("/say")
    public String sayWhat(){
        return demoService.say();
    }
}

启动项目并且运行

ok了!!

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java easyexcel使用教程之导出篇

    Java easyexcel使用教程之导出篇

    EasyExcel是阿里巴巴开源的一个excel处理框架,以使用简单,节省内存著称,下面这篇文章主要给大家介绍了关于Java easyexcel使用教程之导出篇的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-06-06
  • 实例分析java对象中浅克隆和深克隆

    实例分析java对象中浅克隆和深克隆

    在本篇文章中我们给大家分享了关于java对象中浅克隆和深克隆的相关知识点和相关代码内容,有兴趣的朋友们学习下。
    2018-10-10
  • Java中的ConcurrentLinkedQueue使用解析

    Java中的ConcurrentLinkedQueue使用解析

    这篇文章主要介绍了Java中的ConcurrentLinkedQueue使用解析,一个基于链接节点的无界线程安全队列,此队列按照 FIFO(先进先出)原则对元素进行排序,队列的头部是队列中时间最长的元素,需要的朋友可以参考下
    2023-12-12
  • SpringBoot配置Redis实现保存获取和删除数据

    SpringBoot配置Redis实现保存获取和删除数据

    本文主要介绍了SpringBoot配置Redis实现保存获取和删除数据,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,感兴趣的小伙伴们可以参考一下
    2021-06-06
  • java实现猜数字小游戏(Swing版)

    java实现猜数字小游戏(Swing版)

    这篇文章主要介绍了java实现猜数字小游戏,Swing编程版的猜数字游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-05-05
  • 解决mybatis where-if中if不能识别大写AND,OR的问题

    解决mybatis where-if中if不能识别大写AND,OR的问题

    这篇文章主要介绍了解决mybatis where-if中if不能识别大写AND,OR的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • 浅谈hibernate之映射文件VS映射注解

    浅谈hibernate之映射文件VS映射注解

    下面小编就为大家带来一篇浅谈hibernate之映射文件VS映射注解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07
  • mybatis中使用not in与 in的写法说明

    mybatis中使用not in与 in的写法说明

    这篇文章主要介绍了mybatis中使用not in与 in的写法说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • Java杂谈之如何优化写出漂亮高效的代码

    Java杂谈之如何优化写出漂亮高效的代码

    不一致的代码会造成认知上的负担,在一个系统中,做类似的事情,却有不同的做法,或者起到类似作用的事物,却有不同的名字,让人困惑
    2021-09-09
  • java 2d画图示例分享(用java画图)

    java 2d画图示例分享(用java画图)

    这篇文章主要介绍了java 2D画图示例(用java画图),需要的朋友可以参考下
    2014-04-04

最新评论