系列十七、理解SpringBoot中的starter 自定义一个starter

一、概述

        作为后端Java程序员,基本上公司的日常开发都是基于SpringBoot进行的,我们使用SpringBoot也是沉醉于它的各种各样的starter带给我们的便利,这些starter为我们带来了众多的自动化配置,通过这些自动化配置,我们可以很容易地就可以搭建出一个生产级别的开发环境,那么starter到底是什么?它为什么这么神奇这么好用?接下来我会通过通俗易懂的语言 + 实战代码为大家介绍starter。

        所谓starter其实就是各个组织或者公司,为了整合springboot而对外提供的一个组件,本质上就是一个普普通通的maven项目,例如:mybatis-plus-boot-starter、druid-spring-boot-starter、pagehelper-spring-boot-starter等,它的底层是由Spring + SpringMVC中的基础组件实现的,其核心注解是条件注解 @Conditional 即:当classpath下符合某个条件该配置才会生效,例如:

二、自定义一个starter

2.1、步骤

        1、新建一个普通的maven项目(pom中需引入springboot的自动配置);

        2、创建一个HelloProperties类,用于接收application.yml或者application.properties中注入的值;

        3、定义一个HelloService,用来处理接收到的值;

        4、定义自动配置类;

        5、在resources/META-INF目录创建一个spring.factories文件,将自定义的自动配置配置进取;

        6、本地install后,再创建一个springboot工程,引入自定义的starter进行测试

2.2、案例

2.2.1、项目概览

2.2.2、pom

<dependencies>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-autoconfigure</artifactId>
		<version>2.1.8.RELEASE</version>
	</dependency>

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

2.2.3、HelloProperties

/**
 * @Author : 一叶浮萍归大海
 * @Date: 2023/12/2 11:00
 * @Description: 创建一个 HelloProperties 类,用来接受 application.properties 中注入的值
 *
 * @ConfigurationProperties(prefix = "titanic"):
 *      将application.properties或者application.yml中前缀为titanic的属性值自动注入到这个实例中
 */
@Data
@ConfigurationProperties(prefix = "titanic")
public class HelloProperties {
    private static final String DEFAULT_NAME = "JACK";
    private static final String DEFAULT_MESSAGE = "杰克";
    private String name = DEFAULT_NAME;
    private String message = DEFAULT_MESSAGE;
}

2.2.4、HelloService

/**
 * @Author : 一叶浮萍归大海
 * @Date: 2023/12/2 11:00
 * @Description: 
 * 
 */
@Data
public class HelloService {

    /**
     * 姓名
     */
    private String name;

    /**
     * 问候语
     */
    private String message;

    public String sayHello() {
        return name + ":" + message;
    }

}

2.2.5、HelloServiceAutoConfiguration

/**
 * @Author : 一叶浮萍归大海
 * @Date: 2023/12/2 11:00
 * @Description:
 *
 * @EnableConfigurationProperties(HelloProperties.class):使配置的@ConfigurationProperties(prefix = "titanic")生效,让配置的属性成功的进入bean
 * @ConditionalOnClass(HelloService.class):表示当项目的classpath路径存在HelloService时,后面的配置才会生效
 * 流程:
 *  1、自动配置类中首先注入HelloProperties,用于接收在application.yml或application.properties中配置的相关数据;
 *  2、提供一个HelloService实例,将HelloProperties中的值注入进去
 */
@Configuration
@EnableConfigurationProperties(HelloProperties.class)
@ConditionalOnClass(HelloService.class)
public class HelloServiceAutoConfiguration {

    @Resource
    private HelloProperties helloProperties;

    @Bean
    public HelloService helloService() {
        HelloService helloService = new HelloService();
        helloService.setName(helloProperties.getName());
        helloService.setMessage(helloProperties.getMessage());

        return helloService;
    }

}

        题外话:配置到此,我们自定义的自动化配置类就算配好了,但是要想让我们自定义的自动化配置类生效,还需要在resources/META-INF目录创建一个spring.factories文件,文件中的值如下,那么为什么配置spring.factories后,我们自定义的starter就生效了?这块就涉及到SpringBoot的自动配置原理了,请参考前面的文章 系列十三、SpringBoot的自动配置原理分析  这里不再赘述。

2.2.6、spring.factories

org.springframework.boot.autoconfigure.EnableAutoConfiguration=org.star.config.HelloServiceAutoConfiguration

2.2.7、安装到本地 

三、测试

3.1、步骤

        新建一个springboot项目,引入上述自定义的starter,在application.yml中配置相关信息进行测试即可!

3.1 、案例代码

3.1.1、项目概览

3.1.2、pom

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

	<dependency>
		<groupId>org.star</groupId>
		<artifactId>hello-spring-boot-starter</artifactId>
		<version>1.0-SNAPSHOT</version>
	</dependency>
</dependencies>

3.1.3、HelloController

/**
 * @Author : 一叶浮萍归大海
 * @Date: 2023/12/2 11:00
 * @Description:
 */
@RestController
public class HelloController {

    @Resource
    private HelloService helloService;

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

}

3.1.4、application.yml

3.1.5、测试

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

晨曦记账本:掌握技巧,轻松统计交通支出“

你是否曾经为了统计交通支出而烦恼&#xff1f;现在&#xff0c;我们为你推荐晨曦记账本&#xff0c;让你轻松掌握技巧&#xff0c;快速统计上个月交通支出。 首先第一步&#xff0c;我们要进入晨曦记账本并在上方功能栏里选择“查看方式”。并在弹出来的列表里选择“所有记录…

教你5步学会用Llama2:我见过最简单的大模型教学

在这篇博客中&#xff0c;Meta 探讨了使用 Llama 2 的五个步骤&#xff0c;以便使用者在自己的项目中充分利用 Llama 2 的优势。同时详细介绍 Llama 2 的关键概念、设置方法、可用资源&#xff0c;并提供一步步设置和运行 Llama 2 的流程。 Meta 开源的 Llama 2 包括模型权重和…

力扣每日一题day24[150. 逆波兰表达式求值]

给你一个字符串数组 tokens &#xff0c;表示一个根据 逆波兰表示法 表示的算术表达式。 请你计算该表达式。返回一个表示表达式值的整数。 注意&#xff1a; 有效的算符为 、-、* 和 / 。每个操作数&#xff08;运算对象&#xff09;都可以是一个整数或者另一个表达式。两个…

oracle sql相关语法

SQL*PLUS 在SQL*PLUS执行&#xff0c;会在执行后显示查询的执行计划和统计信息 SET AUTOTRACE ON;SELECT * FROM your_table WHERE column_name value;SET AUTOTRACE OFF;PLSQL PLSQL查询sql界面&#xff0c;鼠标右键&#xff0c;点击执行计划&#xff0c;会出现sql的执行计…

非功能关键知识总结(一)

文章目录 一、稳定性(一)、服务级别协议1、SLA2、OLA3、UC (二)、可用性指标(三)、突发事件等级 三、质量(一)、千行代码缺陷数量(二)、软件质量模型的发展(三)、产品质量模型 四、安全(一)、网络安全 五、灾备(一)、灾备指标(二)、灾难恢复等级(三)、容灾技术分类 一、稳定性 …

V8引擎类型转换(VIP课程)

这一章是源于一道面试题 完成以下条件并且输出console if(a 1 && a 2 && a 3) {console.log(true) }好家伙 乍一看一个变量怎么可能等于三个值&#xff1f;带着疑问我们去深入了解 类型系统 在JavaScript中类型系统不同于别的语言&#xff0c;例如JavaSc…

【1】基于多设计模式下的同步异步日志系统-项目介绍

1. 项目介绍 本项⽬主要实现⼀个日志系统&#xff0c; 其主要支持以下功能: • 支持多级别日志消息 • 支持同步日志和异步日志 • 支持可靠写⼊日志到控制台、文件以及滚动文件中 • 支持多线程程序并发写日志 • 支持扩展不同的日志落地⽬标地 2. 开发环境 • CentOS 7 • vs…

免费网站快速收录工具,2023最新网站收录方法

在当今数字化时代&#xff0c;拥有一个被搜索引擎快速收录的网站对于个人、企业或机构而言至关重要。网站的快速收录意味着更广泛的曝光和更多的访问流量&#xff0c;这对于网络存在的任何实体都是非常有价值的。 网站快速收录的重要性 在庞大的互联网世界中&#xff0c;一切…

汇编学习记录

前言 这篇文章是自己在专升本录取~本科开学前学习记录&#xff0c;破解软件的学习在2022年4月 - 2022年5月&#xff0c;汇编学习时间大约为2022年7月 - 2022年9月&#xff0c;我将往期上传的博文整理为一篇文章&#xff0c;作为归纳总结。 以后若继续学习相关领域&#xff0c;此…

003、应用程序框架-UIAbility

之——UIAbility 目录 之——UIAbility 杂谈 正文 1.UIAbility 2.基本使用 2.1 创建Ability工程 2.2 添加基础功能 2.3 新建页面 2.4 页面间的跳转 3.生命周期 总结 杂谈 UIAbility&#xff0c;其中的页面创建、页面间的跳转、数据传递、生命周期。 正文 1.UIAbil…

【Android】MMKV实现本地持久化

引入 (测试操作机器是华为Mate 20 Pro 128G&#xff0c;Android 10&#xff0c;每组重复1k次&#xff0c;时间单位是ms) 可以看出MMKV的耗时比其他耗时少的离谱。再看多进程下的性能&#xff1a; 不必多说。再看和DataStore的对比&#xff1a; 简介 根据MMKV官方文档所言 MM…

波奇学C++:智能指针(二):auto_ptr, unique_ptr, shared_ptr,weak_ptr

C98到C11&#xff1a;智能指针分为auto_ptr, unique_ptr, shared_ptr&#xff0c;weak_ptr,这几种智能都是为了解决指针拷贝构造和赋值的问题 auto_ptr&#xff1a;允许拷贝&#xff0c;但只保留一个指向空间的指针。 管理权转移&#xff0c;把拷贝对象的资源管理权转移给拷贝…

深度学习记录--计算图(前向后向传播)

什么是计算图&#xff1f; 从一个例子入手&#xff1a; 将函数J的计算用流程图表示出来&#xff0c;这样的流程图被称为计算图 简单来说&#xff0c;计算图是用来显示每个变量间的关系的一种图 两种传播方式 计算图有两种传播方式&#xff1a;前向传播 和 后向传播 什么是前…

手写VUE后台管理系统7 - 整合Less样式

整合LESS 安装使用 Less&#xff08;Leaner Style Sheets&#xff09;&#xff0c;是一门向后兼容的 CSS 扩展语言。 Less 官网&#xff1a;https://less.bootcss.com/ 安装 yarn add less安装完成就可以直接使用了 使用 以文件形式定义全局样式 在 assets 目录下创建 less …

精准长尾关键词批量挖掘工具,长尾关键词挖掘正确使用方法

互联网时代&#xff0c;SEO已然成为网站推广的关键一环。而在SEO的世界里&#xff0c;长尾关键词无疑是一块被广泛忽视却蕴含着巨大潜力的宝地。 什么是长尾关键词 长尾关键词&#xff0c;指的是那些相对不那么热门、搜索量较低但更为具体、更贴近用户真实需求的关键词。与短…

JAVAEE 初阶 多线程基础(五)

可重入锁 死锁 内存可见性问题 一 可重入锁二.死锁场景1. 一个线程一把锁场景2. 两个线程两把锁场景3. n个线程m把锁(哲学家就餐问题) 三.Java库中的标准类四.内存可见性问题 一 可重入锁 谈到可重入锁,需要再次回顾线程安全问题原因 1.根本原因:线程的抢占式执行,随机调度 2.多…

【Erlang进阶学习】2、匿名函数

受到其它一些函数式编程开发语言的影响&#xff0c;在Erlang语言中&#xff0c;将函数作为一个对象&#xff0c;赋予其“变量”的属性&#xff0c;即为我们的匿名函数 或 简称 fun&#xff0c;它具有以下特性&#xff1a; &#xff08;匿名函数&#xff1a;不是定义在Erlang模…

基于单片机的多功能视力保护器(论文+源码)

1.系统设计 多功能视力保护器在设计过程中能够对用户阅读过程中的各项数据信息进行控制&#xff0c;整体设计分为亮种模式&#xff0c;分别是自动模式&#xff0c;手动模式。在自动模式的控制下&#xff0c;当单片机检测当前光照不强且有人时就开启LED灯&#xff0c;并且会根据…

uView ui 1x uniapp 表格table行内容长度不一导致高度不统一而出现的不对齐问题

问题 因为td单元格内空长度不定导致行单元格未对齐 解决&#xff1a; 重置td的高度&#xff1a;height:100% 改为height:auto !import <u-table><u-tr v-for"(item,index) in Lineinfo.Cust_Name" ><u-td style"height: auto !important;back…

C++ day49 买卖股票的最佳时机

题目1&#xff1a;121 买卖股票的最佳时机 题目链接&#xff1a;买卖股票的最佳时机 对题目的理解 prices[i]表示一支股票在第i天的价格&#xff0c;只能在某一天买入这支股票&#xff0c;并在之后的某一天卖出该股票&#xff0c;从而获得最大利润&#xff0c;返回该最大值&…