如何自定义SpringBoot中的starter,并且使用它

news2024/11/18 6:00:38

目录

1 简介

2 规范

2.1 命名

2.2 模块划分

3  示例


1 简介

        SpringBoot中的starter是一种非常重要的机制,能够抛弃以前繁琐的配置,将其统一集成进starter,应用者只需要在maven中引入starter依赖,SpringBoot就自动扫描到要加载的信息并启动相应的默认配置,starter让我们摆脱了各种依赖库的处理,SpringBoot会自动通过classpath路径下的类发现需要的bean,并注册进IOC容器,SpringBoot提供了针对日常企业研发应用研发各种场景的spring-boot-starter依赖模块。

2 规范

2.1 命名

SpringBoot提供的starter以spring-boot-starter-xxx的方式命名,如mvc

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

而第三方默认自定义的starter使用xxx-spring-boot-starter的命名规则,以此来区分springBoot提供的starter,如mybatis。这也是约定大于配置的一种理念。

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.0</version>
        </dependency>

2.2 模块划分

一个标准Spring boot Starter的组成:

autoconfigure模块:一般包含自动配置相关代码

starter模块:提供对autoconfigure模块的依赖以及其他的二方依赖,一般业务方通过依赖starter来实现这个组件的依赖

3  示例

功能:分每一个分配中国国籍

相关依赖:

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.6.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.liubujun</groupId>
    <artifactId>learn-spring-boot-starter</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>learn-spring-boot-starter</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-autoconfigure</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>

    <build>
<!--        <plugins>-->
<!--            <plugin>-->
<!--                <groupId>org.springframework.boot</groupId>-->
<!--                <artifactId>spring-boot-maven-plugin</artifactId>-->
<!--            </plugin>-->
<!--        </plugins>-->
    </build>

</project>

第一个工程结构如下:

准备一个Service:

public interface UserService {

    String printUser(String name);
}

Service的实现类:

@Service
public class UserServiceImpl implements UserService {

    LearnProperties learnProperties;

    public UserServiceImpl(LearnProperties learnProperties) {
        this.learnProperties = learnProperties;
    }

    @Override
    public String printUser(String name) {
        return name+" is a citizen of "+learnProperties.getNationality();
    }
}

属性类:国籍从application.properties文件中获取

@ConfigurationProperties(prefix = "starter.user") //将配置文件中的相关属性与Java Bean进行动态绑定
@Data
public class LearnProperties {

    /**
     * 国籍
     */
    private String nationality;

}

配置类:

@Configuration
@EnableConfigurationProperties(LearnProperties.class) //让使用@ConfigurationProperties注解的类(LearnProper)生效
@ConditionalOnProperty(prefix = "starter",name = "isopen",havingValue = "true",matchIfMissing = true)
public class StarterAutoConfig {

    @Autowired
    LearnProperties learnProperties;

    @Bean
    UserService userService(){
        return new UserServiceImpl(learnProperties);
    }
}

//prefix为配置文件中的前缀,

//name为配置的名字

//havingValue是与配置的值对比值,当两个值相同返回true,配置类生效

添加文件工厂:spring.factories

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  com.liubujun.learnspringbootstarter.config.StarterAutoConfig

以上是第一个工程配置完成之后进行打包:

 如此一个starter就制作完成了,那么如何使用它呢,可以想一想平时我们使用第三方依赖的时候是如何去使用它们的starter的,只需要在pom文件中引入该starter就好了。

此时准备第二个工程进行测试,工程结构如下:

步骤一:

在pom文件中引入上一个工程的依赖,如下:

        <!--自定义starter-->
        <dependency>
            <groupId>com.liubujun</groupId>
            <artifactId>learn-spring-boot-starter</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

 步骤二:

在配置文件中进行配置(此处的配置是根据引入上一个工程的依赖来进行配置的,就是第一个工程的属性类)

starter.user.nationality=the People's Republic of China
starter.isopen=true

步骤三:

建一个测试类

@RestController
@RequestMapping("test")
public class TestController {

    @Resource
    UserService userService;

    @GetMapping("test")
    public String testController(String name){
        return userService.printUser(name);
    }
}

测试结果如下:

 可以发现,引入了另外一个工程的starter之后,可以使用里面的相关代码,这也侧面印证了自己之前只引入依赖而没有思考是如何实现的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/72746.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PyTorch笔记 - A ConvNet for the 2020s (ConvNeXt) 网络

欢迎关注我的CSDN:https://blog.csdn.net/caroline_wendy 本文地址:https://blog.csdn.net/caroline_wendy/article/details/128236899 Paper:A ConvNet for the 2020s,FAIR,Berkeley Code:https://github.com/facebookresearch/ConvNeXt 网络结构: stem layer:骨干层…

【k8s宝典】2022年12月份Kubernetes 认证管理员CKA轻松通过攻坚克难技巧

目标&#xff1a;攻克三大难点 提示&#xff1a;本人是12月近期通过的cka考试&#xff0c;所以总结的技巧是当前最新的&#xff0c;后面如果有稍许变化&#xff0c;这些技巧照样适用&#xff0c;题目请以实际为主 复制键不能用怎么办&#xff1f; 新版考试系统使用Ctrl c不…

【论文阅读笔记】Noise2Noise: Learning Image Restoration without Clean Data

官方代码地址&#xff1a;https://github.com/NVlabs/noise2noise 论文地址&#xff1a;https://arxiv.org/abs/1803.04189 第一次接触这方向&#xff0c;相当于翻译了。 摘要 作者通过机器学习将基础统计推理应用于信号重建上&#xff1a;学习将损坏的观察结果&#xff08;co…

商务与经济统计 | 描述统计学

一.表格法和图形法 条形图 是一种描述已在一个频数&#xff0c;相对频数或百分数频数分布中汇总的品质数据的图形方法 饼形图 是一种常用的描绘品质数据的相对频数分布的图形方法 直方图 横轴上表示所关心的变量&#xff0c;纵轴上表示频数&#xff0c;相对频数或百分数频数…

23软考备考已开始,网络工程师知识点速记~(5)

新一轮软考备考来啦~ 为了帮助大家提高备考效率&#xff0c;将2023上半年软考网络工程师知识点速记分享给大家&#xff0c;快来跟着一起打卡学习吧&#xff01; 进程的同步和互斥 计算机有了操作系统后性能大幅度提升&#xff0c;其根本原因就在于实现了进程的并发运行。多个…

接口多实现

一、什么是接口 接口是抽象类的延伸&#xff0c;可以将它看作是纯粹的对象类 二、接口模式的特性 &#xff08;1&#xff09;接口不可以被实例化。 &#xff08;2&#xff09;实现类必须实现接口的所有方法&#xff08;类似于抽象类和抽象方法&#xff09;。 &#xff08;3&…

基于百度飞桨PaddleOCR的图片文字识别

PaddleOCR项目源码&#xff1a;https://github.com/PaddlePaddle/PaddleOCR 飞桨开源文字识别模型套件PaddleOCR&#xff0c;目标是打造丰富、领先、实用的文本识别模型/工具库。最新开源的超轻量PP-OCRv3模型大小仅为16.2M。同时支持中英文识别&#xff1b;支持倾斜、竖排等多…

[附源码]Python计算机毕业设计Django-中国传统手工艺销售平台

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

相似度衡量:苏剑林博客-3

本文主要是对苏剑林老师之前的博客中&#xff0c;对相似度相关的内容稍作整理。 Sentence-bert 是利用bert对两个句子判断相似度。 左图是训练期间的相似度计算方法&#xff0c;右图是推来过程中的相似度计算方法。 训练过程中使用时dense-linear方法&#xff0c;推理过程中…

vue 实现通过字符串关键字符动态渲染 input 输入框

vue 实现通过字符串关键字符动态渲染 input 输入框 今天做一个简单的demo&#xff0c;就是有一个字符串&#xff0c;字符串里面有标识符&#xff0c;前端检测到标识符之后&#xff0c;需要将这个标识符转换成一个 input 输入框并且进行数据输入和绑定功能。 问题描述 就比如现…

SOLIDWORKS 2023新功能揭秘!SOLIDWORKS Simulation 2023版本

SOLIDWORKS 2023新版本已经与大家见面&#xff0c;今天众联亿诚与大家分享SOLIDWORKS Simulation 2023新功能&#xff0c;让我们先一起来看看视频—— 点击观看SOLIDWORKS Simulation 2023新功能 一直以来&#xff0c;SOLIDWORKS Simulation以其易学易用和与设计深度集成深受广…

Docker自定义jdk镜像与上传阿里云

目录 自定义jdk镜像 制作jdk8 :v1.0镜像 alpine制作jdk镜像 alpine简介 基于Alpine制作jdk镜像 Alpine制作jre镜像 Docker镜像上传至阿里云 由于官方没有提供jdk&#xff0c;所以需要自定义jdk来配置java环境&#xff0c;以便于后期部署项目 自定义jdk镜像 制作jdk8 :v1.0…

【JavaWeb】第八章 Servlet

文章目录1、初识Servlet2、Servlet的HelloWorld3、Servlet的生命周期4、Servlet-请求的分发处理5、通过集成HttpServlet类来实现Servlet程序1、初识Servlet Servlet是JavaEE规范之一。规范就是接口。 Servlet是JavaWeb三大组件之一&#xff0c;三大组件分别是Servlet程序、Fi…

JAVA SCRIPT设计模式--行为型--设计模式之Iterator迭代器模式(16)

JAVA SCRIPT设计模式是本人根据GOF的设计模式写的博客记录。使用JAVA SCRIPT语言来实现主体功能&#xff0c;所以不可能像C&#xff0c;JAVA等面向对象语言一样严谨&#xff0c;大部分程序都附上了JAVA SCRIPT代码&#xff0c;代码只是实现了设计模式的主体功能&#xff0c;不代…

[附源码]Python计算机毕业设计Django在线影院系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;我…

[附源码]计算机毕业设计JAVA中小学微课学习系统

[附源码]计算机毕业设计JAVA中小学微课学习系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM myba…

JVM相关学习

一、了解JVM JVM就是Java虚拟机。好处&#xff1a; 一次编写&#xff0c;到处运行&#xff1b;自动内存管理&#xff0c;垃圾回收功能&#xff1b;数组下标越界越界检查&#xff1b;多态。 二、学习JVM 1.程序计数器&#xff08;寄存器&#xff09;&#xff1a; 作用&#x…

成为大数据工程师需要具备什么能力?发展前景好么

数据工程工作存在于各个行业&#xff0c;在银行业、医疗保健业、大型科技企业、初创企业和其他行业找到工作机会。许多职位描述要求数据工程师、拥有数学或工程学位&#xff0c;但如果有合适的经验学位往往没那么重要。 **那么如何获得数据开发相关岗位的工作经验&#xff1f;…

Three.js一学就会系列:03 炫酷3D划线

系列文章目录 Three.js一学就会系列&#xff1a;01 第一个3D网站 Three.js一学就会系列&#xff1a;02 画线 文章目录系列文章目录前言一、省略部分二、使用方法创建一个dom元素创建初始化方法线条动起来效果总结前言 最近开始入坑前端3D建站&#xff0c;跟大家一起慢慢深入t…

磨金石教育摄影技能干货分享|曾毅——尘封的故土,难忘的乡愁

乡愁是远离家乡的游子们&#xff0c;内心对故土美好的执念。我曾经在新疆边境县待过一年&#xff0c;异域的风情的新奇&#xff0c;充满了我的眼睛。我一度觉得这里真不错&#xff0c;在这待一辈子也挺好。 后来有一次去了当地一个汉族村&#xff0c;刚进村子就恍然有一种回家…