我的第一个springboot starter

在springboot中有很多starter,很多是官方开发的,也有是个人或开源组织开发的。这些starter是用来做什么的呐?

一、认识starter

所谓的starter,在springboot中其实是一个依赖,是springboot官方为了方便开发者更好的管理依赖而开发的,像前边提到的mybatis的starter,

<dependency>
            <groupid>org.mybatis.spring.boot</groupid>
            <artifactid>mybatis-spring-boot-starter</artifactid>
            <version>2.1.3</version>
</dependency>

这是一个在springboot中使用mybatis的starter,看下其包含了哪些内容,下面是该starter中包含的依赖,

我的第一个springboot  starter

更有意思的一点是mybatis-spring-boot-starter没有代码,

我的第一个springboot  starter

也就是说 mybatis-spring-boot-starter不具备实际功能,仅仅提供所需的依赖。那么是如何把mybatis相关的内容注入到springboot中的呐,是因为mybatis中有两位一个依赖”mybatis-spring-boot-autoconfigure”,该依赖中有有关自动配置的相关内容,先混个眼熟,

我的第一个springboot  starter

其中,META-INF下的spring.factories和MybatisAutoConfiguration两个文件是重点,后面会重点分析springboot自动配置的原理。

现在,现在对starter有了一个清析的认识, starter提供一个组件集成springboot的入口,包含了需要的依赖以及自动配置类

下面,看下springboot提供了哪些starter。

二、starter汇总

2.1、spring-boot-starter

其依赖为,

<dependency>
      <groupid>org.springframework.boot</groupid>
      <artifactid>spring-boot-starter</artifactid>
    </dependency>

2.2、spring-boot-starter-web

这个是开发springboot web项目时的starter,

<dependency>
      <groupid>org.springframework.boot</groupid>
      <artifactid>spring-boot-starter-web</artifactid>
    </dependency>

2.3、spring-boot-starter-jdbc

和jdbc相关的,其依赖为

<dependency>
      <groupid>org.springframework.boot</groupid>
      <artifactid>spring-boot-starter-jdbc</artifactid>
    </dependency>

2.4、spring-boot-starter-activemq

和activeMQ相关的

<dependency>
      <groupid>org.springframework.boot</groupid>
      <artifactid>spring-boot-starter-activemq</artifactid>
    </dependency>

2.5、spring-boot-starter-data-elasticsearch

和ES相关的

<dependency>
      <groupid>org.springframework.boot</groupid>
      <artifactid>spring-boot-starter-data-elasticsearch</artifactid>
    </dependency>

2.6、spring-boot-starter-data-jpa

和JPA相关的

<dependency>
      <groupid>org.springframework.boot</groupid>
      <artifactid>spring-boot-starter-data-jpa</artifactid>
    </dependency>

2.7、spring-boot-starter-data-mongodb

和mongodb相关的

<dependency>
      <groupid>org.springframework.boot</groupid>
      <artifactid>spring-boot-starter-data-mongodb</artifactid>
    </dependency>

2.8、spring-boot-starter-quartz

和定时任务相关的

 <dependency>
      <groupid>org.springframework.boot</groupid>
      <artifactid>spring-boot-starter-quartz</artifactid>
    </dependency>

2.9、mybatis-spring-boot-starter

和mybatis相关的

<dependency>
            <groupid>org.mybatis.spring.boot</groupid>
            <artifactid>mybatis-spring-boot-starter</artifactid>
            <version>2.1.3</version>
        </dependency>

还有很多starter,这里暂且列举那么多,有个名称上的区别大家发现没,有的是”spring-boot-starter-XX”,有的是”XX-spring-boot-starter”,对于前者可以理解为是springboot官方提供的,对于后者可以理解为是第三方自己开发,我们如果自己开发一个其命名规范最好遵循后者。

三、自定义starter

前边说了很多有关官方的starter,现在自定义一个starter,有如下要求,该starter的名字暂定为:”customer-spring-boot-starter”,其包含一个依赖”customer-spring-boot-autoconfigurer”,在”customer-spring-boot-autoconfigurer”中会读取前缀为”my.customer”的配置文件,并且把MyCustomerService注入到springboot中,现在看要如何自定义一个starter。

3.1、customer-spring-boot-starter

从”mybatis-spring-boot-starter”知道,XX-spring-boot-starter是一个空项目,在该项目中会依赖XX-spring-boot-autoconfigurer,下面新建空项目”customer-spring-boot-starter”,

我的第一个springboot  starter

对于src目录完全可以删除,这里暂时保留,重点看下pom.xml文件,我这里仅依赖了”customer-spring-boot-autoconfigurer”,

<?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>customer-spring-boot-starter</artifactid>
    <version>1.0-SNAPSHOT</version>
    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>
    <dependencies>
        <!--自动配置模块-->
        <dependency>
            <groupid>org.example</groupid>
            <artifactid>customer-spring-boot-autoconfigurer</artifactid>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>
</project>

“customer-spring-boot-starter”就这样了,打包安装到本地仓库即可。

3.2、customer-spring-boot-autoconfigurer

相对于”customer-spring-boot-starter”来说,”custoerm-spring-boot-autoconfigurer”要复杂一些。建一个普通的maven项目即可,

我的第一个springboot  starter

先看MyProperties文件吧,该文件负责读取配置文件(application.properties)文件中前缀为”my.customer”的配置,

MyProperties.java

package com.my.autoconfigurer;

import org.springframework.boot.context.properties.ConfigurationProperties;
/**
 * &#x8BFB;&#x53D6;&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#x4E2D;&#x7684;&#x914D;&#x7F6E;
 * &#x8BFB;&#x53D6;&#x524D;&#x7F00;&#x4E3A;my.customer&#x7684;&#x914D;&#x7F6E;
 * @date 2022/6/12 17:06
 */
@ConfigurationProperties(prefix = "my.customer")
public class MyProperties {
    private String name;
    private String code;

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

    public String getCode() {
        return code;
    }
    public void setCode(String code) {
        this.code = code;
    }
}

该类中使用了@ConfigurationProperties注解用来读取配置文件,所以要引入spring-boot-autoconfigure的依赖,后边pom.xml会体现。下面看要注入的服务,

MyCustomerService.java

package com.my.autoconfigurer;

/**
 * &#x81EA;&#x5B9A;&#x4E49;&#x7684;&#x670D;&#x52A1;&#x7C7B;
 * @date 2022/6/12 17:05
 */
public class MyCustomerService {
    //MyProperties&#x7684;&#x5F15;&#x7528;
    private MyProperties myProperties;

    public MyProperties getMyProperties() {
        return myProperties;
    }
    public void setMyProperties(MyProperties myProperties) {
        this.myProperties = myProperties;
    }
    //&#x81EA;&#x5B9A;&#x4E49;&#x65B9;&#x6CD5;
    public void myCustomerMethod(){
        System.out.println("name:"+myProperties.getName()+",code:"+myProperties.getCode());
    }
}

这个类也很简单,有一个MyProperties的属性,另外有一个自定义方法myCustomerMethod方法。主角要登场了,自动配置类,

MyCustomerAutoconfiguration.java

package com.my.autoconfigurer;

import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * &#x81EA;&#x5B9A;&#x4E49;&#x7684;&#x81EA;&#x52A8;&#x914D;&#x7F6E;&#x7C7B;
 * @date 2022/6/12 17:11
 */
@Configuration
@EnableConfigurationProperties(MyProperties.class)
public class MyCustomerAutoconfiguration {
   //&#x5411;springboot&#x7684;&#x5BB9;&#x5668;&#x4E2D;&#x6CE8;&#x5165;&#x540D;&#x4E3A;"myCustomerService"&#x7684;&#x5B9E;&#x4F8B;
    @Bean
    public MyCustomerService myCustomerService(MyProperties myProperties){
        MyCustomerService myCustomerService=new MyCustomerService();
        myCustomerService.setMyProperties(myProperties);
        return myCustomerService;
    }
}

上面就是一个简单的自定义配置类。配置完这些完了吗,还没有,重量级选手登场,在src/resources下新建”META-INF”文件夹,且在下面新建文件”spring.factories”,

我的第一个springboot  starter

该文件的内容为,

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.my.autoconfigurer.MyCustomerAutoconfiguration

配置这样一个key-value即可,key只能为”org.springframework.boot.autoconfigure.EnableAutoConfiguration”,value就是自定义的配置类,如果有多个使用”,”分割即可。另外该文件的名称也只能是”spring.factories”

上面的这些配置完成,最后看下pom.xml文件,

<?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>customer-spring-boot-autoconfigurer</artifactid>
    <version>1.0-SNAPSHOT</version>
    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>
    <dependencies>
    <!--springboot的自动配置依赖-->
        <dependency>
            <groupid>org.springframework.boot</groupid>
            <artifactid>spring-boot-autoconfigure</artifactid>
            <version>2.3.3.RELEASE</version>
        </dependency>
    </dependencies>
</project>

至此,自定义自动配置完成,打包安装到本地仓库即可。

3.3、使用customer-spring-boot-starter

上面已经完成了第一个自定义的starter,到了真金验证的时候了,

导入”customer-spring-boot-starter”依赖,

我的第一个springboot  starter

写个测试类,测试下是否自动导入了”MyCustomerService”类,

package com.my.template.controller;

import com.my.autoconfigurer.MyCustomerService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * &#x6D4B;&#x8BD5;&#x81EA;&#x52A8;&#x914D;&#x7F6E;&#x7C7B;
 * @date 2022/6/12 17:46
 */
@Controller
public class MyController {
    //&#x81EA;&#x52A8;&#x6CE8;&#x5165;&#x7684;&#x7C7B;
    @Autowired
    private MyCustomerService myCustomerService;

    @RequestMapping("test")
    @ResponseBody
    public void test(){
        myCustomerService.myCustomerMethod();
    }
}

另外在application.properites文件中配置自定义的配置文件,

#&#x81EA;&#x5B9A;&#x4E49;&#x914D;&#x7F6E;
my.customer.name=hello
my.customer.code=autoconfiguration

启动服务,看下打印结果,

我的第一个springboot  starter

可以看到打印的和配置的是一样的,证明自定义的自动配置类成功,就是说自定义starter成功。

四、总结

本文从”mybatis-spring-boot-starter”开始,分析了一个starter的组成部分,然后总结了常用的starter,重点是实现了一个自定义的starter,并成功获取到自定义的配置。

1、starter包含要注入的类的依赖及自定配置模块(XX-spring-boot-autoconfigure);

2、自动配置模块(XX-spring-boot-autoconfigure)包含自动配置类及spring.factories文件;

不知道小伙伴对springboot如何实现自动配置好奇吗,我们下期见。

我的第一个springboot  starter

Original: https://www.cnblogs.com/teach/p/16368650.html
Author: 良工说技术
Title: 我的第一个springboot starter

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/594160/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Spring知识点总结5 反射与代理

    反射机制允许程序在执行期借助API取得任何类的内部信息,并能直接操作任意对象的内部属性方法 反射 java反射机制提供的功能 在运行期间判断任意一个对象所属的类 在运行期间构造任意…

    Java 2023年6月6日
    069
  • 【maven】Dependency “XXX”not found

    父工程pom文件中依赖报红, <dependencymanagement></dependencymanagement> 中依赖报红属于正常现象,在子工程继…

    Java 2023年6月15日
    063
  • 01-SpringCloud介绍

    Spring Cloud provides tools for developers to quickly build some of the common patterns in…

    Java 2023年6月7日
    098
  • springboot-jta-atomikos多数据源事务管理

    背景 我们平时在用springboot开发时,要使用事务,只需要在方法上添加@Transaction注解即可,但这种方式只适用单数据源,在多数据源下就不再适用; 比如在多数据源下,…

    Java 2023年6月7日
    077
  • Java HashMap深入理解增删改查 源码学习 学习笔记

    Java源码解读(三)— HashMap深入理解之增删查改 学习地址:[HashMap深入理解之增删查改]: https://blog.csdn.net/dongmuyang/ar…

    Java 2023年6月5日
    0123
  • 全网最新最详细最明白教程之Spring源码搭建,没有之一,超详细

    相关帖子有很多但是都不是最新的 Gradle,我在使用Gradle最新版编译的时候简直坑死我了,弄了好久。接下来给大家详细说一下这个安装过程,以及相关的软件版本号。 相关软件、依赖…

    Java 2023年6月7日
    093
  • 分布式任务调度平台XXL-JOB安装及使用

    一、为什么需要任务调度平台 在Java中,传统的定时任务实现方案,比如Timer,Quartz等都或多或少存在一些问题: 不支持集群、不支持统计、没有管理平台、没有失败报警、没有监…

    Java 2023年6月5日
    086
  • 设计模式 18 中介者模式

    中介者模式(Mediator Pattern)属于 行为型模式 一提到中介,大家都非常熟悉,生活中最常见的就是房屋中介。 虽然中介要收取一定费用,但却能给房东和租客都提供大量遍历,…

    Java 2023年6月6日
    0109
  • 16.判断JSON是JSONObject或者JSONArray

    JSONObject json=new JSONObject();Object json1=new JSONTokener(rrinfo.getParametersJson())….

    Java 2023年6月13日
    088
  • springbean的生命周期

    作者:你的雷哥 出处:https://www.cnblogs.com/henuliulei/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保…

    Java 2023年5月30日
    088
  • 老生常谈系列之Aop–Aop的经典应用之Spring的事务实现分析(一)

    老生常谈系列之Aop–Aop的经典应用之Spring的事务实现分析(一) 前言 前面的系列文章已经大概讲解了Spring Aop的实现,从AspectJ开始,到Spri…

    Java 2023年6月8日
    092
  • Windows下 RabbitMQ的安装和配置

    简介 RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。RabbitMQ服务器是用Erlang语言编写的,而集群和故障转移是构建在开放…

    Java 2023年6月5日
    0111
  • day02_基本语法

    基本语法 学习目标: 1. 数据类型 2. 变量 3. 编码介绍 4. 标识符和关键字 5. 字符串类型 6. 数据类型转化 7. 进制转换 8. 运算符 一、数据类型 什么是数据…

    Java 2023年6月8日
    059
  • 4、多态

    多态概念(一共三点满足就行) 1、 继承 2、程序运行时将子类对象赋值给父类 3、通过父类去调用子类的方法 一、父类类型做方法的参数 <span class=”kwd”&gt…

    Java 2023年6月6日
    097
  • 【简记】virt-manager查看虚拟机详情出现报错:启动详情报错:‘NoneType’ object has no attribute ‘change_run_text’

    问题描述 因为最近某台KVM虚拟机内存不够用,准备扩容点击了virt-manager上的虚拟机详情,出现如图报错: 解决步骤 1、关闭virt-manager,重启libvirtd…

    Java 2023年5月30日
    064
  • 并发编程学习

    Semaphore Semaphore 可以允许多个线程访问一个临界区。 应用:实现线程池 CountDownLatch 应用: 业务原始状态:一个线程执行查询订单,查询派送单,对…

    Java 2023年6月8日
    053
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球