SpringBoot实践(三十八):自定义spring-boot-starter

news2025/2/25 16:24:03

目录

自动配置原理

 自定义starter包

导入springboot的自动配置依赖 

测试业务代码

spring.factories配置

​编辑

 本地包上传

使用自定义starter依赖

测试和配置


自动配置原理

基于springBoot的starter机制能够让我们在使用外部包时候非常方便,只需要引入该组件提供的starter包即可,比如在pom中引入mybatis的mybatis-plus-boot-starter依赖包,那么springboot启动时候会自动扫描所有的依赖该包下META-INF文件夹下的spring.factories把自动配置类加入容器:

在spring.factories中会指定自动配置类:

# Auto Configure
org.springframework.boot.env.EnvironmentPostProcessor=\
  com.baomidou.mybatisplus.autoconfigure.SafetyEncryptProcessor
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  com.baomidou.mybatisplus.autoconfigure.MybatisPlusLanguageDriverAutoConfiguration,\
  com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration

其中MybatisPlusAutoConfiguration.java中会初始化若干的配置,在MybatisPlusProperties.class文件中,还有其他一些关于jdbc连接的条件注解;

@Configuration
@ConditionalOnClass({SqlSessionFactory.class, SqlSessionFactoryBean.class})
@ConditionalOnSingleCandidate(DataSource.class)
@EnableConfigurationProperties({MybatisPlusProperties.class})

 自定义starter包

测试自定义starter包,该starter包中引入springboot的自动配置依赖,配置spring.factories文件中的自动加载类,实现的功能是在测试的springBoot工程中引入自定义的starter包的pom依赖后,能够调用starter包中的某些实例方法,具体而言是读取application.properties或者application.yml的配置输出;

首先创建1个空的项目,作为自定义starter包和测试的springboot工程的父工程,添加2个子模块:

导入springboot的自动配置依赖 

创建spring初始化器生成的子模块test01-spring-boot-starter,跟mybatis类似,或者直接copy,增加spring-boot-starter的依赖管理(不引入),只引入1个自动配置依赖;

	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-dependencies</artifactId>
				<version>2.3.7.RELEASE</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
		</dependencies>
	</dependencyManagement>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-autoconfigure</artifactId>
			<scope>compile</scope>
		</dependency>
	</dependencies>

测试业务代码

创建1个属性配置类TestProperties.java,读取application.properties中的配置:

package com.example.hello.bean;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties(prefix = "test.hello")
public class TestProperties {
    String prefix;
    String suffix;

    public String getPrefix() {
        return prefix;
    }

    public void setPrefix(String prefix) {
        this.prefix = prefix;
    }

    public String getSuffix() {
        return suffix;
    }

    public void setSuffix(String suffix) {
        this.suffix = suffix;
    }
}

 创建业务代码,实现模拟的业务需求,它使用上面的配置类读取配置做业务处理(直接输出);

package com.example.hello.service;
import com.example.hello.bean.TestProperties;
import org.springframework.beans.factory.annotation.Autowired;


public class HelloService {

    @Autowired
    TestProperties testProperties;

    public String sayHello() {
        return testProperties.getPrefix() + "<---- say hello --->" + testProperties.getSuffix();
    }

}

再创建1个自动配置类TestAutoConfiguration.java,该类将被写入spring.factories中作为自动配置类在后面的测试springBoot工程启动中被扫描到IOC容器,该配置类将把上面的service服务实例化;

package com.example.hello.config;
import com.example.hello.service.HelloService;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@ConditionalOnMissingBean(HelloService.class)
public class TestAutoConfiguration {

    @Bean
    public HelloService makeHelloService(){
        return new HelloService();
    }
}

spring.factories配置

在\resources\META-INF下创建spring.factories文本,指定当前测试stater包中的配置类:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.hello.config.TestAutoConfiguration

工程目录如下: 

 本地包上传

以上就完成业务逻辑,使用pom的clean+install命令把该starter工程上传本地,其他程序可以直接通过pom引入;

使用自定义starter依赖

再创建1个子模块test-my-project,作为真正的依赖上面的业务代码实体,它是个web应用:

 编辑其pom依赖如下,这里的重点是test01-spring-boot-starter的依赖工程,是我们上面本地上传的包;

	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-dependencies</artifactId>
				<version>2.3.7.RELEASE</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
		</dependencies>
	</dependencyManagement>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-autoconfigure</artifactId>
			<scope>compile</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>com.example</groupId>
			<artifactId>test01-spring-boot-starter</artifactId>
			<version>0.0.1-SNAPSHOT</version>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

测试和配置

当前工程的application.properties写入以下配置:

test.hello.prefix = prefix
test.hello.suffix = suffix

直接使用注解使用starter包中的HelloService这个bean,它将在启动时候被IOC实例化;

@RestController
public class HelloController {
    @Autowired
    HelloService helloService;

    @GetMapping("/hello")
    public String sayHello(){
        return helloService.sayHello();
    }
}

输出正常表明测试的starter包被成功引入,并且实现了业务代码的类被IOC实例化,在真实的工程中可以直接调用。

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

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

相关文章

PCB学习笔记—3D PCB封装的创建

放置3D元件体&#xff1a;常规的、自定义、圆柱形、球体。第一个是厚度&#xff0c;第二个是焊盘和芯片的悬浮高度。一般电阻的高度设置成0.6mm就够了&#xff0c;电容1.25mm&#xff0c;悬浮高度为0。按键&#xff1a;放置3D元件体&#xff0c;Tab键&#xff0c;选择常规&…

快过年静不下心?不如刷刷《剑指offer》静一静(第七天)

跟着博主一起刷题 这里使用的是题库&#xff1a; https://leetcode.cn/problem-list/xb9nqhhg/?page1 目录剑指 Offer 49. 丑数剑指 Offer 51. 数组中的逆序对剑指 Offer 55 - I. 二叉树的深度剑指 Offer 49. 丑数 剑指 Offer 49. 丑数 我一开始的思路是&#xff0c;把数字1~无…

机器学习HW15元学习

文章目录一、简介Task: Few-shot Classification实验1、simple2、medium3、strong4、boss三、代码模型构建准备工作一、简介 任务对象是Omniglot数据集上的few-shot classification任务&#xff0c;内容是利用元学习找到好的初始化参数。 Task: Few-shot Classification The…

在VSCode中使用Compaq Visual Fortran编译运行Frotran程序

本片文章主要是为了使用VSCode编译运行带QuickWin的老版本Fortran代码。 一、准备工作 安装VSCode和Compaq Visual Fortran6.6。 二、配置Fortran工程 用VSCode打开保存有Frotran代码的文件夹 建立.vscode文件夹&#xff0c;建立launch.json和task.json文件&#xff0c;分…

二、TCP/IP---Ethernet和IP协议

TCP/ip协议栈 OSI模型TCP/IP协议栈应用层&#xff0c;表示层&#xff0c;会话层应用层传输层主机到主机层&#xff08;传输层&#xff09;网络层网络层数据链路层&#xff0c;物理层网络接入层 Ethernet协议 以太网&#xff0c;实现链路层的数据传输和地址封装&#xff08;MA…

马蹄集 三角形坐标

三角形坐标 难度&#xff1a;青铜 ○时间限制&#xff1a;1秒 巴占用内存&#xff1a;64M 输入三角形三个顶点A,B,C的坐标(x,y),根据公式计算并输出三 角形面积。 S1/2*X1y2X2y33y1-X1y3-X2y1-x3y2 #include <bits/stdc.h> using namespace std; int main(){double x[4],…

Win10应用商店无法加载错误0x80072F7D怎么办?

Win10应用商店无法加载错误0x80072F7D怎么办&#xff1f;有用户开启电脑的Win10软件商店想要获取软件的时候&#xff0c;发现软件页面无法进行正常的加载&#xff0c;里面的内容显示为错误代码0x80072F7D。那么这个情况怎么去进行解决呢&#xff1f;一起来看看详细的解决方法分…

PMP证书到期了,有必要续吗?

我觉得续证是有需要的&#xff0c;毕竟证书有用的地方很多。 下面我们将从两方面分享&#xff1a; 1. PMP 证书在国内的含金量怎么样&#xff1f; 2. HR 如何看待 PMP 证书&#xff1f; 说到 PMP 证书的含金量&#xff0c;相信这个问题是所有人都关心的。对于如何来评判 PMP…

达芬奇密码题解

题目信息达芬奇隐藏在蒙娜丽莎中的数字列:1 233 3 2584 1346269 144 5 196418 21 1597 610 377 10946 89 514229 987 8 55 6765 2178309 121393 317811 46368 4181 1 832040 2 28657 75025 34 13 17711 记录在达芬奇窗台口的神秘数字串:36968853882116725547342176952286这道题…

Vue3——第十章(异步组件:defineAsyncComponent)

一、defineAsyncComponent基本使用 在大型项目中&#xff0c;我们可能需要拆分应用为更小的块&#xff0c;并仅在需要时再从服务器加载相关组件。Vue 提供了 defineAsyncComponent 方法来实现此功能&#xff1a; 如你所见&#xff0c;defineAsyncComponent 方法接收一个返回 P…

文档流code案例小汇【处理高度塌陷】

clear mdn文档 clear只是清除浮动&#xff0c;不能缓解【高度塌陷】 https://developer.mozilla.org/zh-CN/docs/Web/CSS/clear 值 none 元素不会被向下移动以清除浮动。left 元素被向下移动以清除左浮动。right 元素被向下移动以清除右浮动。both 元素被向下移动以清除左右浮动…

LeetCode刷题模版:61 - 70

目录 简介61. 旋转链表62. 不同路径63. 不同路径 II64. 最小路径和65. 有效数字【未理解】66. 加一67. 二进制求和68. 文本左右对齐【未实现】69. x 的平方根70. 爬楼梯结语简介 Hello! 非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出~ ଘ(੭ˊᵕˋ)੭ 昵称:…

1月第1周榜单丨B站UP主排行榜(飞瓜数据B站)发布!

飞瓜轻数发布2023年1月2日-1月8日飞瓜数据UP主排行榜&#xff08;B站平台&#xff09;&#xff0c;通过充电数、涨粉数、成长指数三个维度来体现UP主账号成长的情况&#xff0c;为用户提供B站号综合价值的数据参考&#xff0c;根据UP主成长情况用户能够快速找到运营能力强的B站…

Web(四)

基本对象&#xff1a;1. Function&#xff1a;函数(方法)对象创建&#xff1a;1. var fun new Function(形式参数列表,方法体); //忘掉吧2. function 方法名称(形式参数列表){方法体}3. var 方法名 function(形式参数列表){方法体}既是方法也是对象&#xff0c;不传或者参数不…

PyG Temporal搭建STGCN实现多变量输入多变量输出时间序列预测

目录I. 前言II. STGCNIII. PyG TemporalIV. 模型训练/测试V. 代码I. 前言 前面已经写过不少时间序列预测的文章&#xff1a; 深入理解PyTorch中LSTM的输入和输出&#xff08;从input输入到Linear输出&#xff09;PyTorch搭建LSTM实现时间序列预测&#xff08;负荷预测&#x…

C++——类和对象1

目录 1. 类和对象认识 2. 类的引入 3. 类的定义 4. 类的访问限定符及封装 4.1 访问限定符 4.2 封装 5. 类的作用域 6. 类的实例化 7. 类对象模型 7.1 如何计算类对象的大小 7.2 类对象的存储方式猜测 7.3 结构体内存对齐规则 8. this指针 8.1 this指针的…

cv-cuda (cvcuda、nvcv)教程——Python安装

由于当前版本安装后&#xff0c;大家反应import nvcv cvcuda 失败&#xff0c;看官方文档&#xff0c;当前还不是很规范&#xff0c;特此记录当前版本的安装方法。 官方安装文档&#xff1a;Installation — CV-CUDA Alpha documentation 方法一、如果你有权限推荐deb安装方式…

机器学习第15章-规则学习

机器学习第15章-规则学习 以下列出我觉得重要&#xff0c;在编码的思路中可以参考的地方 冲突消融 当一条规则的判断出现不同的结果时&#xff0c;解决冲突的方法 1.投票法 2.排序法 3.无规则法 序贯覆盖 生成规则过程中去除当前规则所能覆盖的数据 生成方式 自顶向下…

双软认证的好处,赶紧来看看吧

1、“双软件”认可对企业有什么好处&#xff1f; 对于认定的软件企业&#xff0c;从盈利年度起&#xff0c;第一年和第二年免征企业所得税&#xff0c;第三年至第五年减半征收企业所得税&#xff0c;即两免三减。对认定软件产品的企业&#xff0c;对实际增值税负担超过3%的部分…

【ONE·C++ || vector (二)】

总言 主要讲述vector的模拟实现。 文章目录总言1、基本框架搭建&#xff1a;成员变量2、对构造函数、析构函数3、增删查改、空间扩容3.1、vector::push_back、vector::pop_back3.2、vector::reserve、vector::capacity、vector::size3.3、operator[ ]3.4、遍历&#xff1a;迭代…