首页 > 其他分享 >自定义springboot-starter包

自定义springboot-starter包

时间:2023-08-13 20:44:24浏览次数:55  
标签:SpringBoot 自定义 spring boot String config starter springboot

https://www.cnblogs.com/yuansc/p/9088212.html  

前言

我们都知道可以使用SpringBoot快速的开发基于Spring框架的项目。由于围绕SpringBoot存在很多开箱即用的Starter依赖,使得我们在开发业务代码时能够非常方便的、不需要过多关注框架的配置,而只需要关注业务即可。

例如我想要在SpringBoot项目中集成Redis,那么我只需要加入spring-data-redis-starter的依赖,并简单配置一下连接信息以及Jedis连接池配置就可以。这为我们省去了之前很多的配置操作。甚至有些功能的开启只需要在启动类或配置类上增加一个注解即可完成。

那么如果我们想要自己实现自己的Starter需要做些什么呢?下面就开始介绍如何实现自己的SpringBoot-xxx-starter。

原理

首先说说原理,我们知道使用一个公用的starter的时候,只需要将相应的依赖添加的Maven的配置文件当中即可,免去了自己需要引用很多依赖类,并且SpringBoot会自动进行类的自动配置。那么 SpringBoot 是如何知道要实例化哪些类,并进行自动配置的呢? 下面简单说一下。

首先,SpringBoot 在启动时会去依赖的starter包中寻找 resources/META-INF/spring.factories 文件,然后根据文件中配置的Jar包去扫描项目所依赖的Jar包,这类似于 Java 的 SPI 机制。

第二步,根据 spring.factories配置加载AutoConfigure类。

最后,根据 @Conditional注解的条件,进行自动配置并将Bean注入Spring Context 上下文当中。

我们也可以使用@ImportAutoConfiguration({MyServiceAutoConfiguration.class}) 指定自动配置哪些类。

实现

终于到了代码实现的步骤,接下来就开始编码我们自己的SpringBoot-starter。

第一步创建一个SpringBoot 项目,并添加下面两个依赖到pom.xml文件当中

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-configuration-processor</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-autoconfigure</artifactId>
    </dependency>
</dependencies>

 

其中 spring-boot-configuration-processor 的作用是编译时生成 spring-configuration-metadata.json ,此文件主要给IDE使用。如当配置此jar相关配置属性在 application.yml ,你可以用ctlr+鼠标左键点击属性名,IDE会跳转到你配置此属性的类中。

我们日常使用的Spring官方的Starter一般采取spring-boot-starter-{name} 的命名方式,如 spring-boot-starter-web 

而非官方的Starter,官方建议 artifactId 命名应遵循{name}-spring-boot-starter 的格式。 例如:ysc-spring-boot-starter  。

<groupId>com.ysc</groupId>
<artifactId>simple-spring-boot-starter</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>jar</packaging>

第二步编写我们的Service类

这里讲一下我们的Starter要实现的功能,很简单,提供一个Service,包含一个能够将配置文件中配置的字符串根据传入的字符进行分割的方法String[] split(String separatorChar)

public class StarterService {
    private String config;

    public StarterService(String config) {
        this.config = config;
    }
    
    public String[] split(String separatorChar) {
        return StringUtils.split(this.config, separatorChar);
    }
    
}

第三步编写配置文件读取类

@ConfigurationProperties("example.service")
public class StarterServiceProperties {
    private String config;
    
    public void setConfig(String config) {
        this.config = config;
    }
    
    public String getConfig() {
        return config;
    }
 }

第四步,编写AutoConfigure类 ,这步是关键点

@Configuration

@EnableConfigurationProperties(StarterServiceProperties.class)//如果需要在@Configuration文件中使用到某个Properties,就得使用该注解
public class StarterAutoConfigure {

    @Autowired
    private StarterServiceProperties properties;

    @Bean
    @ConditionalOnMissingBean
    @ConditionalOnProperty(prefix = "example.service", value = "enabled", havingValue = "true")
    StarterService starterService (){
        return new StarterService(properties.getConfig());
    }

}

解释一下代码中用到的几个注解:

  • @ConditionalOnClass,当classpath下发现该类的情况下进行自动配置。
  • @ConditionalOnMissingBean,当Spring Context中不存在该Bean时。
  • @ConditionalOnProperty(prefix = "example.service",value = "enabled",havingValue = "true"),当配置文件中example.service.enabled=true时。
下面列举SpringBoot中的所有@Conditional注解及作用
@ConditionalOnBean:当容器中有指定的Bean的条件下  
@ConditionalOnClass:当类路径下有指定的类的条件下  
@ConditionalOnExpression:基于SpEL表达式作为判断条件  
@ConditionalOnJava:基于JVM版本作为判断条件  
@ConditionalOnJndi:在JNDI存在的条件下查找指定的位置  
@ConditionalOnMissingBean:当容器中没有指定Bean的情况下  
@ConditionalOnMissingClass:当类路径下没有指定的类的条件下  
@ConditionalOnNotWebApplication:当前项目不是Web项目的条件下  
@ConditionalOnProperty:指定的属性是否有指定的值  
@ConditionalOnResource:类路径下是否有指定的资源  
@ConditionalOnSingleCandidate:当指定的Bean在容器中只有一个,或者在有多个Bean的情况下,用来指定首选的Bean @ConditionalOnWebApplication:当前项目是Web项目的条件下  

最后一步,在resources/META-INF/下创建spring.factories文件,并添加如下内容:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.example.autocinfigure.StarterAutoConfigure

至此,我们的一个Starter代码部分就是完成了,下面将项目安装到本地Maven仓库中。

发布

1.在项目根目录执行 mvn install 进行打包安装。

 2. 在cmd 下执行 mvn install:install-file -Dfile=D:\project\ simple-spring-boot-starter  \target\ simple-spring-boot-starter-1.0-SNAPSHOT   -DgroupId= com.ysc   -DartifactId= simple-spring-boot-starter   -Dversion= 1.0-SNAPSHOT   -Dpackaging=jar

测试

将Starter项目的依赖添加到我们自己的SpringBoot项目中

<dependency>
    <groupId>com.ysc</groupId>
    <artifactId>simple-spring-boot-starter</artifactId>
    <version>1.0-SNAPSHOT</version>
 </dependency>

application.yml 配置文件中添加配置信息:

example
  service
    enabled: true
    config: abc-des-dde,SSS-DRS-RE,SDR-SDFR-XXX

在本地使用JUnit进行代码测试

@Autowired
private StarterService starterService;

@Test
public void starterTest() {
    String[] splitArray = starterService.split(",");
    System.out.println(splitArray);
}

好,到这我们的一个自定义Stater就完成了

 

maven编译插件

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.6.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>

统一版本管理

查看日志:《spring boot如何进行统一版本的管理》

 

发布到maven私服配置:命令 mvn deploy

已知:

 

 

maven settting.xml

       <server>

        <id>maven-releases</id>

        <username>admin</username>

        <password>admin123</password>

      </server>

       <server>

        <id>maven-snapshots</id>

        <username>admin</username>

        <password>admin123</password>

      </server>

 

pom.xml 配置

如果工程版本号是以-SNAPSHOT结尾的就会发布到快照中(快照jar,maven会每次都抽取最新到本地仓库中;版本jar,如果本地已存在,就不会再拉取,有新版本的情况才会更新)

<distributionManagement>
<repository>
<id>maven-releases</id>
<url>http://192.168.101.16:8081/nexus/content/repositories/releases/</url>
</repository>

<snapshotRepository>
<id>maven-snapshots</id>
<url>http://192.168.101.16:8081/nexus/content/repositories/snapshots/</url>
</snapshotRepository>
</distributionManagement>
 

标签:SpringBoot,自定义,spring,boot,String,config,starter,springboot
From: https://www.cnblogs.com/anquing/p/17627234.html

相关文章

  • ApiPost自定义环境变量 缓存token的操作步骤
    使用场景:测试的时候获取token,然后其他请求的时候自动带token。获取Token后,执行后执行脚本,apt.variables.set("token",response.json.access_token);请求回来的参数在json中,根据需要修改这时候token就存储到环境变量中了2.使用的时候如下:......
  • springboot综合案例第四课
    day04_springboot综合案例用户管理查询用户查询所有用户执行流程编写UserMapper接口publicinterfaceUserMapper{//查询所有用户List<UserInfo>findAllUsers();}编写UserServicepublicinterfaceUserServiceextendsUserDetailsService{/**......
  • Redundant declaration: @SpringBootApplication already applies given @ComponentSc
    报错提示内容: 解决:将启动类文件移动到com.atguigu.eduservice包。应该是EduApplication.java文件自带的@SpringBootApplication中包含@ComponentScan,默认是扫描该类所在的包和子包的,即@ComponentScan(basePackages={"com.atguigu"}),所以再写一遍就提示多余的。 ......
  • Mybatis-plus自动填充starter
    Mybatis-plus自动填充starter前言:上一篇我们说了自动填充,现在利用spring-boot把它抽象为一个组件,可以在项目中共同使用工具IDEA2021.1.1MAVEN3.6.3JDK1.8spring-boot2.1.3.RELEASE配置一、引入依赖<!--mybatis-plusstart勿需再引入mybatis依赖了--><depe......
  • feign中传递自定义MultipartFile
    前言在使用SpringCloud的feign组件过程中,我们想传递一个文件到服务提供者.但是我们只有byte[],这是就需要手动创建MultipartFile实现接口MultipartFileimportjava.io.ByteArrayInputStream;importjava.io.File;importjava.io.FileOutputStream;importjava.io.IOExc......
  • springboot统一异常处理
    1全局异常处理:先新建一个类,之后在类上面添加注解之后在类中添加方法,在方法上添加注解,指定哪个异常出现会执行2特定异常处理:把全局异常出行中的方法上面的注解变化一下就可以3自定义异常处理:第一步创建异常类,继承RuntimeException;第二步在异常类中添加属性(状态码和描述信......
  • SpringBoot的核心特性
    SpringBoot是一个用于简化Spring应用程序开发的框架,它提供了一系列核心特性,使得开发者能够更快速、更简单地构建和部署Spring应用程序。本文将详细介绍SpringBoot的五个核心特性,并为每个特性提供三个子特性的详细解释。1.独立运行的Spring应用程序SpringBoot允许开发者创建独立......
  • 自定义组件使用v-model
    场景描述我们在一个系统中,会出现这样的情况,有一个联系人的下拉框,这个下拉框中的数据是从服务端获取的。在很多页面都需要使用这个联系人(下拉框)。我们通常是这样做的:写一个下拉框组件然后调用接口。这样不仅会造成代码冗余,而且不利于后期的维护。比如说:如果有一天这个要发......
  • SpringBoot3集成Quartz
    目录一、简介二、工程搭建1、工程结构2、依赖管理3、数据库4、配置文件三、Quartz用法1、初始化加载2、新增任务3、更新任务4、暂停任务5、恢复任务6、执行一次7、删除任务8、任务执行四、参考源码标签:Quartz.Job.Scheduler;一、简介Quartz由Java编写的功能丰富的开源作业调度......
  • Springboot 启动流程
    整体流程1.SpringApplication静态调用run方法,从静态run方法中new一个自己的实例,并调用实例的run方法。2.构造方法中会初始化容器一些属性,主要是初始化两个数据集合:a.配置文件中以ApplicationContextInitializer为key的初始化器的实例集合。b.配置文件中以ApplicationListener......