【Springboot】| 从深入自动配置原理到实现 自定义Springboot starter

目录

  • 一. 🦁 前言
  • 二. 🦁 Spring-boot starter 原理实现分析
    • 2.1 自动配置原理
  • 三. 🦁 操作实践
    • 3.1 项目场景
    • 3.2 搭建项目
    • 3.3 添加相关依赖
    • 3.4 删除一些不需要的东西
    • 3.5 发邮件工具类逻辑编写
    • 3.6 创建相关配置类
    • 3.7 创建 Spring.factories 文件
    • 3.8 目录结构展示
    • 3.9 打包
  • 四. 🦁 测试使用
  • 五. 🦁 总结

权限管理

一. 🦁 前言

Springboot starter是SpringBoot的一个重要概念,是“一站式服务 (one-stop)”的依赖 Jar 包包含 Spring 以及相关技术(比如 Redis)的所有依赖提供了自动配置的功能,开箱即用提供了良好的依赖管理,避免了包遗漏、版本冲突等问题。

简单来说, Springboot starter 提供了一种自动配置的机制,我们只需要将需要的Starter引入项目中,它就会自动为我们配置相关的依赖和配置。这使得开发人员可以更加关注业务逻辑的实现;现在我们来学习一下它的原理,以便后面能更清晰地实现。

二. 🦁 Spring-boot starter 原理实现分析

2.1 自动配置原理

在此之前,我们主要先来了解自动配置原理。

  1. 首先,我们可以把Springboot的启动流程简化成以下几步:
    Springboot启动流程
    在第3步加载处理所有配置类,其处理流程如下:
    在这里插入图片描述
    由上图可知道,加载配置类主要由两个注解完成,一个是@ComponentScan和@Import注解完成。
    其中,@ComponentScan其实就是@SpringbootApplication里面的注解之一,其作用是为了扫描其同级或者子包下的配置类(即与启动类同级或者子包下的配置类,这也是为啥我们做项目的时候,只需要导入一个starter就能实现某功能,其余工作都是Springboot帮我们干了),
    @Import 注解则在@EnableAutoConfiguration注解(其作用之一就是为了开启自动配置功能)里面,通过导入一个选择器ImportSelector的方式,提供了一种显式地从其它地方加载配置类的方式,这样可以避免使用性能较差的组件扫描(Component Scan)
    那么以上哪种注解适合用来实现自动配置呢?

无疑是使用导入选择器ImportSelector的@Import注解适合加载第三方jar包导入;

回到 @SpringbootApplication 注解,其注解组成如下:
在这里插入图片描述
而@EnableAutoConfiguration则是开启自动配置的核心注解,它由以下注解组成:
在这里插入图片描述
它通过导入AutoConfigurationImportSelector.class来实现自动配置;
而AutoConfigurationImportSelector类则是基于SpringFactories机制来实现的,现在来看一下它的主要源码:
在这里插入图片描述
getAutoConfigurationEntry(annotationMetadata)方法如下:
在这里插入图片描述
我们主要来看一下getCandidateConfigurations(annotationMetadata, attributes)方法:

protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {List<String> configurations = new ArrayList(SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader()));ImportCandidates.load(AutoConfiguration.class, this.getBeanClassLoader()).forEach(configurations::add);Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories nor in META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports. If you are using a custom packaging, make sure that file is correct.");return configurations;}

这个则是基于SpringFactories机制获得第三方jar包中所有自动配置类的方法。由代码可以知道,读取配置文件获取自动配置类时,使用的key是类EnableAutoConfiguration的全限定名。其主要流程如下:
在这里插入图片描述
最后总结一下:
在这里插入图片描述

这里狮子是学习了B站一个UP主的视频理解的,推荐给大家:码场安员外

三. 🦁 操作实践

3.1 项目场景

前面狮子写了一篇《【SpringBoot】| 邮箱发送验证码,你会了吗?》深受伙伴们捧场,今天我们基于这个基础上再来封装一下spring-boot-starter-mail发送邮件类型的starter,方便后续使用。

3.2 搭建项目

我们先来搭建一个Springboot项目;根据Springboot starter的命名规范,属于Spring官方的就以spring-boot-starter-xxx的形式命名,其他技术自动整合Springboot的则按照xxx-spring-boot-starter命名。现在狮子起名为lion-email-spring-boot-starter,提高识别度(很规范(bushi),如下:

在这里插入图片描述

3.3 添加相关依赖

先添加Lombokspring-boot-starter-mail Spring Confguration Processor依赖(很重要,后面会体现它的价值);
在这里插入图片描述

3.4 删除一些不需要的东西

  1. 测试依赖
    在这里插入图片描述
  2. 打包插件
    在这里插入图片描述
  3. 启动类
    启动类也用不着,可以删了;

3.5 发邮件工具类逻辑编写

这种工具类写法比较固定,并不需要去记忆,自己积累一个就好。

import lombok.AllArgsConstructor;
import lombok.Data;
import org.springframework.stereotype.Component;import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Properties;/*** 发邮件工具类*/
@Data
@AllArgsConstructor
public final class MailUtils {private String USER; // 发件人邮箱地址private String PASSWORD; // 如果是qq邮箱可以使户端授权码/*** 发送邮件* @param to 收件人邮箱* @param text 邮件正文* @param title 标题*/public boolean sendMail(String to, String text, String title){try {final Properties props = new Properties();props.put("mail.smtp.auth", "true");props.put("mail.smtp.host", "smtp.qq.com");// 发件人的账号props.put("mail.user", USER);//发件人的密码props.put("mail.password", PASSWORD);// 构建授权信息,用于进行SMTP进行身份验证Authenticator authenticator = new Authenticator() {@Overrideprotected PasswordAuthentication getPasswordAuthentication() {// 用户名、密码String userName = props.getProperty("mail.user");String password = props.getProperty("mail.password");return new PasswordAuthentication(userName, password);}};// 使用环境属性和授权信息,创建邮件会话Session mailSession = Session.getInstance(props, authenticator);// 创建邮件消息MimeMessage message = new MimeMessage(mailSession);// 设置发件人String username = props.getProperty("mail.user");InternetAddress form = new InternetAddress(username);message.setFrom(form);// 设置收件人InternetAddress toAddress = new InternetAddress(to);message.setRecipient(Message.RecipientType.TO, toAddress);// 设置邮件标题message.setSubject(title);// 设置邮件的内容体message.setContent(text, "text/html;charset=UTF-8");// 发送邮件Transport.send(message);return true;}catch (Exception e){e.printStackTrace();}return false;}}

3.6 创建相关配置类

创建LionEmailConfig配置类,在这里面干两个事:
一是在配置类里实例化MailUtils类,并将邮箱地址以及授权码返回给mailUtils;
二是配置参数:一般配置参数都是在Spring Boot 的application.yml中。我们会定义一个前缀标识来作为名称空间隔离各个组件的参数。对应的组件会定义一个XXXProperties 来自动装配这些参数。自动装配的机制基于@ConfigurationProperties注解,请注意一定要显式声明你配置的前缀标识(prefix)
这里需要添加几个注解,如下:

  1. @Configuration:在这里进行自动配置的工作。可以使用条件注解(@ConditionalOnClass、@ConditionalOnProperty 等)来根据情况决定是否应用自动配置。
  2. @ConfigurationProperties(“lion.email”):用于将外部配置属性绑定到 Spring Boot 应用程序中的 Java 对象上。这里加了一个lion.email前缀,则表示在配置文件(例如yaml文件)中,lion.email前缀下的字段值都会加载到Java对象中。
import com.lion.emailstarter.utils.MailUtils;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;@Configuration
@ConfigurationProperties("lion.email")
@ComponentScan
@Data
public class LionEmailConfig {private String user = "2373489842@qq.com"; // 发件人邮箱地址private String password = "abc-kpi"; // 如果是qq邮箱可以使户端授权码@Beanpublic MailUtils mailUtils(){return new MailUtils(user,password);}
}

3.7 创建 Spring.factories 文件

  1. 在 src/main/resources 目录下,创建一个名为 META-INF/spring.factories 的文件。
    在这里插入图片描述
  2. 文件里面的内容为(写法很单一,cv即可):
# spring boot starter
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.lion.emailstarter.LionEmailConfig

3.8 目录结构展示

在这里插入图片描述

3.9 打包

如下:
在这里插入图片描述
在这里插入图片描述
显示成功则说明该starter已经打包到本地的版本库中,starter编写完成。

四. 🦁 测试使用

随便找一个SpringBoot项目,

  1. 导入刚刚创建好的lion-email-spring-boot-starter依赖
  <dependency><groupId>com.lion</groupId><artifactId>lion-email-spring-boot-starter</artifactId><version>0.0.1-SNAPSHOT</version>
<dependency>
  1. 参数编写
    我们在yaml文件编写相关参数:
    当我们输入lion的时候就会弹出相关提示,这是因为前面3.3节我们添加了Spring Confguration Processor的缘故,自动生成配置的代码提示。
  2. 测试
@SpringBootTest
class LionTelecomsApplicationTests {@Autowiredprivate MailUtils mailUtils;@Testvoid contextLoads() {mailUtils.sendMail("2373489842@qq.com","有内鬼, 终止交易!","测试starter");}
}
  1. 测试结果
    在这里插入图片描述

五. 🦁 总结

这个技能对你有用么??有用点个赞,咱们下期见!


在这里插入图片描述

🦁 其它优质专栏推荐 🦁

🌟《Java核心系列(修炼内功,无上心法)》: 主要是JDK源码的核心讲解,几乎每篇文章都过万字,让你详细掌握每一个知识点!

🌟 《SpringBoot 源码剥析核心系列》:一些场景的Springboot源码剥析以及常用Springboot相关知识点解读

欢迎加入狮子的社区:『Lion-编程进阶之路』,日常收录优质好文

更多文章可持续关注上方🦁的博客,2023咱们顶峰相见!

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

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

相关文章

保障Web安全:构建可靠的网络防御体系

在当今数字化时代&#xff0c;Web安全已成为互联网世界中至关重要的议题。随着网络攻击手段的不断演进和网络犯罪的增加&#xff0c;保护用户数据和确保系统安全性已成为任何Web应用程序的首要任务。本文将深入探讨Web安全的重要性以及构建可靠的网络防御体系的关键要素。我们将…

LLMs之dataset:大语言模型LLMs相关开源数据集的简介、下载、使用方法之详细攻略

LLMs之dataset:大语言模型LLMs相关开源数据集的简介、下载、使用方法之详细攻略 目录 LLMs相关开源数据集的简介 1、SFT→RM+PPO三阶段关系梳理、数据集格式对比

Dart PowerTCP Emulation for .NET Crack

Dart PowerTCP Emulation for .NET Crack .NET CF上的PowerTCP Emulation为手持设备提供了高级的Internet通信组件。这些功能允许同步操作&#xff0c;这样可以消耗更少的资源&#xff0c;提供更大的灵活性&#xff0c;并生成易于维护的软件。带有.NET的PowerTCP仿真包括VT52、…

服务器Linux系统配置mysql数据库主从自动备份

服务器Linux系统配置mysql数据库主从自动备份 当数据内容越来越多的时候&#xff0c;数据库也变得越来越大了。如果不小心误删了&#xff0c;或者被黑主机了&#xff0c;那就什么都没有了。所以数据库的数据怎么能让它不丢失做到万无一失变得尤为重要&#xff01; 我是艾西&a…

《机器学习核心技术》分类算法 - 决策树

「作者主页」&#xff1a;士别三日wyx 「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;小白零基础《Python入门到精通》 决策树 1、决策树API2、决策时实际应用2.1、获取数据集2.2、划分数据集2.3、决策…

微服务(rpc)

微服务&#xff08;rpc&#xff09; 微服务必备的模块生产者消费者管理平台流量控制集群情况下如何做到流量监控 负载均衡服务发现和治理序列化传输序列化和反序列化 微服务是一种架构风格&#xff0c;将一个应用程序拆分为一组小型、独立的服务&#xff0c;每个服务都可以独立…

iOS 页面布局兼容放大模式

背景 有用户反馈&#xff0c;在iPhone SE 2代 存在遮挡UI界面问题&#xff0c;经过分析&#xff0c;发现用户开启了放大模式&#xff08;Display Zoom -> Larger Font&#xff09;导致实际显示时屏幕大小与正常模式不同&#xff0c;所以导致部分UI遮挡。 各手机屏幕在正常…

Vue3 中自定义hook函数

自定义hook函数 使用Vue3的组合API封装的可复用的功能函数&#xff1b;自定义hook的作用类似于vue2中的mixin技术&#xff1b;自定义Hook的优势: 很清楚复用功能代码的来源, 更清楚易懂&#xff1b; 什么是vue2中的mixin混入&#xff1f; 混入 (mixin) 提供了一种非常灵活的…

Mybatis映射.动态sql.分页

介绍&#xff1a; 动态SQL是MyBatis提供的一种动态生成SQL语句的方式&#xff0c;可以根据不同的条件生成不同的SQL语句&#xff0c;从而实现更加灵活的查询和操作。 在MyBatis的映射文件中&#xff0c;可以通过使用if、choose、when、otherwise、foreach等标签来实现动态SQL…

深入理解Reactor模型的原理与应用

1、什么是Reactor模型 Reactor意思是“反应堆”&#xff0c;是一种事件驱动机制。 和普通函数调用的不同之处在于&#xff1a;应用程序不是主动的调用某个 API 完成处理&#xff0c;而是恰恰相反&#xff0c;Reactor逆置了事件处理流程&#xff0c;应用程序需要提供相应的接口并…

同步和异步有什么区别,使用场景?

同步(Synchronous)和异步(Asynchronous)是用于描述不同的操作和通信模式的术语。它们在处理任务、执行代码以及处理通信时有很大的异同。 同步(Synchronous) 同步操作是指程序的执行顺序按照代码的先后顺序进行,一个操作完成后才能执行下一个操作。在同步操作中,调用一…

阿里云机器学习PAI全新推出特征平台 (Feature Store),助力AI建模场景特征数据高效利用

推荐算法与系统在全球范围内已得到广泛应用&#xff0c;为用户提供了更个性化和智能化的产品推荐体验。在推荐系统领域&#xff0c;AI建模中特征数据的复用、一致性等问题严重影响了建模效率。阿里云机器学习平台 PAI 推出特征平台&#xff08;PAI-FeatureStore&#xff09; 。…

Python 密码破解指南:15~19

协议&#xff1a;CC BY-NC-SA 4.0 译者&#xff1a;飞龙 本文来自【OpenDocCN 饱和式翻译计划】&#xff0c;采用译后编辑&#xff08;MTPE&#xff09;流程来尽可能提升效率。 收割 SB 的人会被 SB 们封神&#xff0c;试图唤醒 SB 的人是 SB 眼中的 SB。——SB 第三定律 十五、…

前端基础(Element、vxe-table组件库的使用)

前言&#xff1a;在前端项目中&#xff0c;实际上&#xff0c;会用到组件库里的很多组件&#xff0c;本博客主要介绍Element、vxe-table这两个组件如何使用。 目录 Element 引入element 使用组件的步骤 使用对话框的示例代码 效果展示 vxe-table 引入vxe-table 成果展…

极简Vim教程

2023年8月27日&#xff0c;周日上午 我不想学那么多命令和快捷键&#xff0c;够用就行... 所以就把我自己认为比较常用的命令和快捷键记录成博客 目录 预备知识Vim的工作模式保存内容退出Vim复制、粘贴和剪切选中一段内容复制粘贴剪切撤回和反撤回撤回反撤回查找替换删除删除…

深入理解Android消息机制的原理

Handler & Looper & MessageQueue关系简述 一个线程至多有一个looper&#xff1b;一个looper有一个mq&#xff1b;一个mq对应多个message&#xff1b;一个message对应多个handler。消息类型&#xff1a;同步、异步、同步屏障消息。无限循环&#xff1a;在队列中没有消…

stm32串口通信(PC--stm32;中断接收方式;附proteus电路图;开发方式:cubeMX)

单片机型号STM32F103R6: 最后实现的效果是&#xff0c;开机后PC内要求输入1或0&#xff0c;输入1则打开灯泡&#xff0c;输入0则关闭灯泡&#xff0c;输入其他内容则显示错误&#xff0c;值得注意的是这个模拟的东西只能输入英文 之所以用2个LED灯是因为LED电阻粗略一算就是1…

fat32 文件系统 误删除文件数据恢复 SDK 介绍

fat32 文件系统 误删除文件数据恢复 SDK 介绍 fat32_analyze.dll 是一个专门用于恢复 fat32 文件系统误删除文件的标准的动态链接库(DLL)&#xff0c; 可被任何其他程序直接加载调用。 下载地址&#xff1a; https://gitee.com/tankaishuai/powerful_sdks/tree/master/fat32_a…

计算机视觉教程的量化转移学习

(实验性&#xff09;计算机视觉教程的量化转移学习 本教程以 Sasank Chilamkurthy 编写的原始 PyTorch 转移学习教程为基础。 转移学习是指利用预训练的模型应用于不同数据集的技术。 使用转移学习的主要方式有两种&#xff1a; 作为固定特征提取器的 ConvNet &#xff1a;在…

【Tkinter系列02/5】界面初步和布局

本文是系列文章第二部分。前文见&#xff1a;【Tkinter系列01/5】界面初步和布局_无水先生的博客-CSDN博客 说明 一般来说&#xff0c;界面开发中&#xff0c;如果不是大型的软件&#xff0c;就不必用QT之类的实现&#xff0c;用Tkinter已经足够&#xff0c;然而即便是Tkinter规…