SpringBoot之自定义Starter

目录

一、自己的理解

1. 理解一

2. 理解二

二、自定义starter(重点)

三、以mybatis-spring-boot-starter为例进行分析

1. 写好自己的自动配置类逻辑

2. 创建自己的starter项目并引入自动配置类项目的依赖

3. 在其它项目中使用自定义的starter

一、自己的理解

1. 理解一

自定义Starter的常规流程:

(1)自定义一个项目,叫做 xxx-spring-boot-autoconfigure (比如mybatis-spring-boot-autoconfigure), 在这个项目里面写自定义的配置类:xxxAutoConfiguration ---> xxxProperties,然后在项目的 META-INF/spring.factories文件中把自己的自动配置类配置进去(可以参照其它starter进行配置)从而使得项目启动自动加载指定的自动配置类;

(2)自定义一个项目,artifactId叫做xxx-spring-boot-starter (比如mybatis-spring-boot-starter)

(3)在(2)中引入(1)的依赖【即starter的pom文件里面引入autoconfigure包】

(4)在其它项目中使用自定义的Starter,就是引入(2)的依赖,然后在自己的配置文件中配置需要和xxxProperties绑定的配置信息,这样就可以在自己的项目中使用自定义的starter了。

2. 理解二

        场景启动器里面没有源代码,场景启动器里面一般只负责在其pom文件里面声明这个场景启动器有哪些依赖,同时场景启动器里面引入了当前场景的自动配置依赖,而在自动配置包里面要引入springboot最底层的,每一个模块都要引入的spring-boot-starter,如下图:

二、自定义starter(重点)

        根据 <理解二>中的图,自定义一个starter,其详细步骤如下:

(1) 创建一个空工程,空工程里面可以容纳多个项目,如下图:

 (2)在新的空工程里面创建第一个模块(场景启动器starter模块)

shg-hello-spring-boot-starter 如下图:

(3)在新工程里面创建第二个模块(自动配置模块),如下图:

 (4)场景启动器(shg-hello-spring-boot-starter) 里面需要引入 自动配置模块 (shg-hello-spring-boot-starter-autoconfigure),如下图:

(5)<自动配置>这个项目不需要启动,所以不需要主启动类,也不需要配置文件,可以把多余的东西删除,如下图:

 

(6)一个业务场景是这样的:比如有一个业务方法是<给别人打招呼>,其使用场景是你给我传入一个姓名,我给你输出一句问候语,并且这个问候语的格式是<可配置的前缀>+传入的姓名+<可配置的后缀>。

        这个业务方法经常被使用,被多个模块使用,那么我就可以把这个业务方法抽取出来 。如下所示:

(7)在自动配置类的resource下创建 META-INF/spring.factories文件,在此文件中配置EnableAutoConfiguration 的值,这个值指定的就是需要在SpringBoot项目启动时自动加载的配置类(当然这个配置类生效与否还要看其是否满足自动配置类的条件),如下:

(8)打包项目并安装到本地仓库中

       因为场景启动器要依赖自动配置包,所以要先打包自动配置包,再打包场景启动器;如下图:

 

 

 至此就成功开发了自己的场景启动器,那么如何在其它项目中进行使用呢?接着看:

(8)新建一个测试项目,在其pom文件引入自定义的场景启动器,如下:

(9)直接编写业务方法,进行使用,如下:

 

(10)进行测试:

 

(11) 其它一些想法:

  • 可以给HelloProperties的属性给定一些默认值,当其它项目使用我们的场景启动器(自定义starter时)如果没有在配置文件进行配置值,就使用我们默认给定的值;
  • 条件装配(比如我们的自动配置类在给容器中添加组件时需要经过一些条件判断,当满足某种条件时才给容器中放入某个组件)
  • ... 

三、以mybatis-spring-boot-starter为例进行分析

1. 写好自己的自动配置类逻辑

说明:自动配置类里面需要的属性信息和xxxProperties类进行绑定

(1)自定义一个项目,artifactId叫做 <mybatis-spring-boot-autoconfigure>,如下图:

2. 创建自己的starter项目并引入自动配置类项目的依赖

(2)自定义一个项目,artifactId叫做xxx-spring-boot-starter (比如mybatis-spring-boot-starter)

(3)(2)中引入(1)的依赖【即starter的pom文件里面引入autoconfigure包】,如下图:

3. 在其它项目中使用自定义的starter

(4)在其它项目中使用自定义的Starter,就是引入(2)的依赖,然后在自己的配置文件中配置需要和xxxProperties绑定的配置信息,这样就可以在自己的项目中使用自定义的starter了。 

 

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

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

相关文章

c++遍历算法的transform算法

transform 算法函数用于对指定范围内的元素进行一个操作&#xff0c;并将结果存储到另一个范围中。 template<class InputIterator, class OutputIterator, class UnaryOperation> OutputIterator transform(InputIterator first, InputIterator last, OutputIterator r…

共享智能指针shared_ptr

共享智能指针 在C中没有垃圾回收机制&#xff0c;必须自己释放分配的内存&#xff0c;否则就会造成内存泄露。解决这个问题最有效的方法是使用智能指针&#xff08;smart pointer&#xff09;。智能指针是存储指向动态分配&#xff08;堆&#xff09;对象指针的类&#xff0c;…

[ 云计算 | AWS 实践 ] 使用 Java 检查指定的密钥是否存在于给定的 Amazon S3 存储桶中

本文收录于【#云计算入门与实践 - AWS】专栏中&#xff0c;收录 AWS 入门与实践相关博文。 本文同步于个人公众号&#xff1a;【云计算洞察】 更多关于云计算技术内容敬请关注&#xff1a;CSDN【#云计算入门与实践 - AWS】专栏。 本系列已更新博文&#xff1a; [ 云计算 | …

C++ 智能指针和内存管理:使用指南和技巧

C是一门强大的编程语言&#xff0c;但是在内存管理方面却存在着一些问题。手动管理内存不仅费时费力&#xff0c;而且容易出错。因此&#xff0c;C中引入了智能指针这一概念&#xff0c;以更好地管理内存。 什么是智能指针&#xff1f; 在C中&#xff0c;内存的分配和释放都是…

AttributeError: ‘FieldInfo‘ object has no attribute ‘required‘.

诸神缄默不语-个人CSDN博文目录 这个bug是在安装doccano包之后&#xff0c;在运行transformers代码时出现的。 核心报错信息&#xff1a; RuntimeError: Failed to import transformers.models.bert.modeling_bert because of the following error (look up to see its trac…

Java 数组另类用法(字符来当数组下标使用)

一、原因 看力扣的时候发现有位大佬使用字符来当数组下标使用。 class Solution {public int lengthOfLongestSubstring(String s) {int result 0;int[] hash new int[130];int i 0;for(int j 0; j < s.length(); j) {while(hash[s.charAt(j)] > 0) {hash[s.charAt…

服务器入侵如何防护,业务被攻击如何处理,服务器安全防护方案

服务器是算是家用电脑的一种使用方法,主机不在用户家中,需要远程使用,在目前互联网时代占用很重要的位置&#xff0c;当然生活中也是应用广泛。服务器比普通计算机运行更快、负载更高、价格更贵。很多娱乐,工作都需要依靠服务器来运行整个体系&#xff0c;因此服务器的安全防护…

虚拟化逻辑架构: VM VirtualBox 指定6.0.24版本开启硬件辅助虚拟化功能

目录 一、实验 1.安装VM VirtualBox-6.0.24 2.安装VM VirtualBox-6.1.26 3.再次重新安装VM VirtualBox-6.0.24 二、问题 1.系统开机报错 2.Ubuntu系统无法自适应VM VirtualBox系统边框 3.VirtualBox如何开启无缝模式 3.Ubuntu如何查询软件是否已经安装 一、实验 1.安…

SCAU:主对角线上的元素之和

主对角线上的元素之和 Time Limit:1000MS Memory Limit:65535K 题型: 编程题 语言: G;GCC 描述 输入一个3行4列的整数矩阵&#xff0c;计算并输出主对角线上的元素之和输入格式 3行4列整数矩阵输出格式 主对角线上的元素之和输入样例 1 2 3 4 5 6 7 8 9 10 11 12输出…

react二次封装Modal和Drawer组件

目录 react二次封装Modal和Drawer组件01&#xff1a;Modal组件01-1 BaseModal.jsx01-2 使用BaseModal组件01-3 效果 02&#xff1a;Drawer组件02-1 BaseDrawer.jsx组件02-2 使用BaseDrawer组件02-3效果 react二次封装Modal和Drawer组件 npm i styled-components 01&#xff1…

详细学习PyQt5中的多线程

Pyqt5相关文章: 快速掌握Pyqt5的三种主窗口 快速掌握Pyqt5的2种弹簧 快速掌握Pyqt5的5种布局 快速弄懂Pyqt5的5种项目视图&#xff08;Item View&#xff09; 快速弄懂Pyqt5的4种项目部件&#xff08;Item Widget&#xff09; 快速掌握Pyqt5的6种按钮 快速掌握Pyqt5的10种容器&…

【Shell3】日常巡检1

#!/usr/bin/env bash# --------------------------------------------------------------------------------- # 控制台颜色 BLACK"\033[1;30m" RED"\033[1;31m" GREEN"\033[1;32m" YELLOW"\033[1;33m" BLUE"\033[1;34m" PU…

go语言学习-包管理

1、概念 1.1 什么是包 ***Go语言的包(package) ***是一种源码封装的方式,可以被看做是组相关的,并且通用的代码集合。这些包都有自己的独立的功能,然后在编写代码时,如果需要用到这些功能,可以导入包直接使用。 打印一些内容:fmt处理一些时间相关的: time处理一些数学相关…

移除元素、合并两个有序数组(leetcode)

一、移除元素 思路三&#xff1a; while(src<numsSize) 使用一个 while 循环来遍历数组。循环的条件是 src 必须小于 numsSize&#xff0c;以确保不会越界。 if(nums[src]!val) 如果当前 src 指向的元素不等于给定的值 val&#xff0c;则执行以下操作&#xff1a; nums[ds…

Leetcode 第 374 场双周赛 Problem D 100146. 统计感冒序列的数目(组合数学+阶乘+逆元)

Leetcode 第 374 场双周赛 Problem D 100146. 统计感冒序列的数目&#xff08;组合数学阶乘逆元&#xff09;题目 给你一个整数 n 和一个下标从 0 开始的整数数组 sick &#xff0c;数组按 升序 排序。有 n 位小朋友站成一排&#xff0c;按顺序编号为 0 到 n - 1 。数组 sick 包…

[RoFormer]论文实现:ROFORMER: ENHANCED TRANSFORMER WITH ROTARY POSITION EMBEDDING

文章目录 一、完整代码二、论文解读2.1 注意力机制2.2 绝对位置编码2.3 相对位置编码2.4 旋转位置编码Long-term decayAdaption for linear attention 2.5 模型效果 三、过程实现四、整体总结 论文&#xff1a;ROFORMER: ENHANCED TRANSFORMER WITH ROTARY POSITION EMBEDDING …

Java 使用itextpdf创建Pdf文件

DOM文件添加Maven依赖 <dependency><groupId>com.itextpdf</groupId><artifactId>itext7-core</artifactId><version>7.2.0</version><type>pom</type></dependency> 主要代码&#xff1a; PdfFont font PdfFo…

【数据结构】拆分详解 - 二叉树的链式存储结构

文章目录 一、前置说明二、二叉树的遍历  1. 前序、中序以及后序遍历   1.1 前序遍历   1.2 中序遍历   1.3 后序遍历 2. 层序遍历 三、常见接口实现  0. 递归中的分治思想  1. 查找与节点个数   1.1 节点个数   1.2 叶子节点个数   1.3 第k层节…

yo!这里是智能指针相关介绍

目录 前言 内存泄漏 RAII 智能指针原理 智能指针分类 auto_ptr unique_ptr shared_ptr 两个问题 线程安全 循环引用 后记 前言 对于智能指针&#xff0c;听起来很高大上&#xff0c;其实本质上就是一个类。为什么叫指针呢&#xff1f;因为可以像指针一样管理一块资…

linux 应用开发笔记---【I/O文件/基础篇 】

文章笔记来自于【速学Linux】手把手教你学嵌入式Linux C应用编程_哔哩哔哩_bilibili 一&#xff0c;什么是linux应用程序 1.运行在linux操作系统用户空间的程序 2.内核程序运行在内核空间&#xff0c;应用程序运行在用户空间 在终端执行的命令ls,ps。。。。。。都是运行在用…