【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() {
                @Override
                protected 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邮箱可以使户端授权码

	@Bean
    public 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 {

    @Autowired
    private MailUtils mailUtils;

    @Test
    void contextLoads() {
        mailUtils.sendMail("2373489842@qq.com","有内鬼, 终止交易!","测试starter");
    }
}

  1. 测试结果
    在这里插入图片描述

五. 🦁 总结

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


在这里插入图片描述

🦁 其它优质专栏推荐 🦁

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

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

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

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

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

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

相关文章

【javaweb】学习日记Day7 - Mysql 数据库 DQL 多表设计

之前学习过的SQL语句笔记总结戳这里→【数据库原理与应用 - 第六章】T-SQL 在SQL Server的使用_Roye_ack的博客-CSDN博客 目录 一、DQL 数据查询 1、基本查询 2、条件查询 3、分组查询 &#xff08;1&#xff09;聚合函数 ① count函数 ② max min avg sum函数 &…

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

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

基于大数据+django+mysql的银行信用卡用户的数仓系统

系统阐述的是银行信用卡用户的数仓系统的设计与实现&#xff0c;对于Python、B/S结构、MySql进行了较为深入的学习与应用。主要针对系统的设计&#xff0c;描述&#xff0c;实现和分析与测试方面来表明开发的过程。开发中使用了 django框架和MySql数据库技术搭建系统的整体架构…

gitcode中删除已有的项目

镜像地址&#xff1a; https://www.jianshu.com/p/504c1418adb7?v1693021320653 扩展阅读 如何在GitLab中删除一个项目 https://www.codenong.com/cs106866762/ 简介&#xff1a; 如何在GitLab中删除一个项目 最近GIT上建了太多项目。想清一下&#xff0c;就在网上查了查…

opencv-答题卡识别判卷

#导入工具包 import numpy as np import argparse import imutils import cv2# 设置参数 ap argparse.ArgumentParser() ap.add_argument("-i", "--image", requiredTrue,help"path to the input image") args vars(ap.parse_args())# 正确答案…

【动手学深度学习】--18.图像增广

文章目录 图像增广1.常用的图像增广方法1.1翻转和裁剪1.2改变颜色1.3结合多种图像增广方法 2.使用图像增广进行训练3.训练 图像增广 官方笔记&#xff1a;图像增广 学习视频&#xff1a;数据增广【动手学深度学习v2】 图像增广在对训练图像进行一系列的随机变化之后&#xff…

实验八 网卡驱动移植

【实验目的】 掌握 Linux 内核配置的基本方法&#xff0c;完成对网卡驱动、NFS 等相关功能的配置 【实验环境】 ubuntu 14.04 发行版FS4412 实验平台交叉编译工具&#xff1a;arm-none-linux-gnueabi- 【注意事项】 实验步骤中以“$”开头的命令表示在 ubuntu 环境下执行&…

21.2 CSS 三大特性与页面布局

1. 开发者工具修改样式 使用开发者工具修改样式, 操作步骤如下: * 1. 打开开发者工具: 在浏览器中右键点击页面, 然后选择检查或者使用快捷键(一般是 F12 或者 CtrlShiftI)来打开开发者工具.* 2. 打开样式编辑器: 在开发者工具中, 找到选项卡或面板, 一般是Elements或者Elemen…

最新AI系统ChatGPT程序源码/微信公众号/H5端+搭建部署教程+完整知识库

一、前言 SparkAi系统是基于国外很火的ChatGPT进行开发的Ai智能问答系统。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。 那么如何搭建部署AI创作ChatGPT&#xff1f;小编这里写一个详细图文教程吧&#xff01…

不系安全带抓拍自动识别

不系安全带抓拍自动识别系统通过yolo系列算法框架模型利用高清摄像头&#xff0c;不系安全带抓拍自动识别算法对高空作业场景进行监控&#xff0c;当检测到人员未佩戴安全带时会自动抓拍并进行告警记录。YOLO系列算法是一类典型的one-stage目标检测算法&#xff0c;其利用ancho…

一生一芯8——在github上添加ssh key

为在github上下载代码框架&#xff0c;这里在github上使用ssh key进行远程连接&#xff0c;方便代码拉取 参照博客https://blog.csdn.net/losthief/article/details/131502734 本机 系统ubuntu22.04 git 版本2.34.1 本人是第一次配置&#xff0c;没有遇到奇奇怪怪的错误&…

Faster RCNN网络数据流总结

前言 在学习Faster RCNN时&#xff0c;看了许多别人写的博客。看了以后&#xff0c;对Faster RCNN整理有了一个大概的了解&#xff0c;但是对训练时网络内部的数据流还不是很清楚&#xff0c;所以在结合这个版本的faster rcnn代码情况下&#xff0c;对网络数据流进行总结。以便…

TiDB 源码编译之 TiProxy 篇

作者&#xff1a; ShawnYan 原文来源&#xff1a; https://tidb.net/blog/3d57f54d TiProxy 简介 TiProxy 是一个基于 Apache 2.0 协议开源的、轻量级的 TiDB 数据库代理&#xff0c;基于 Go 语言编写&#xff0c;支持 MySQL 协议。 TiProxy 支持负载均衡&#xff0c;接收来…

【SpringCloud技术专题】「Gateway网关系列」(2)微服务网关服务的Gateway功能配置指南分析

Spring Cloud Gateway简介 Spring Cloud Gateway是Spring Cloud体系的第二代网关组件&#xff0c;基于Spring 5.0的新特性WebFlux进行开发&#xff0c;底层网络通信框架使用的是Netty&#xff0c;所以其吞吐量高、性能强劲&#xff0c;未来将会取代第一代的网关组件Zuul。Spri…

opencv-gpu版本编译(添加java支持,可选)实现硬解码

目录 opencv gpu版本编译&#xff0c;实现硬解码&#xff0c;加速rtsp视频流读取1、准备文件2、复制 NVCUVID 头文件到 cuda 安装目录 include3、安装相关依赖4、 执行cmake5、编译安装6、测试 opencv gpu版本编译&#xff0c;实现硬解码&#xff0c;加速rtsp视频流读取 前置条…

为什么使用Nacos而不是Eureka(Nacos和Eureka的区别)

文章目录 前言一、Eureka是什么&#xff1f;二、Nacos是什么&#xff1f;三、Nacos和Eureka的区别3.1 支持的CAP3.2连接方式3.3 服务异常剔除3.4 操作实例方式 总结 前言 为什么如今微服务注册中心用Nacos相对比用Eureka的多了&#xff1f;本文章将介绍他们之间的区别和优缺点…

2023前端面试笔记 —— CSS3

系列文章目录 内容链接2023前端面试笔记HTML52023前端面试笔记CSS3 文章目录 系列文章目录前言一、CSS选择器的优先级二、通过 CSS 的哪些方式可以实现隐藏页面上的元素三、px、em、rem之间有什么区别&#xff1f;四、让元素水平居中的方法有哪些五、在 CSS 中有哪些定位方式六…

windows11系统重装步骤及优化技巧

目录 目录 本文目的 Windows11介绍 Windows下载 和win10对比 重装步骤 系统设置调整 系统备份还原 C盘减肥&#xff0c;空间优化技巧 Java开发工具 本文目的 说明windows11的系统重装步骤&#xff0c;大部分步骤也适用于其他windows版本。常用软件的安装与介绍。系统…

Jmeter 如何才能做好接口测试?

现在对测试人员的要求越来越高&#xff0c;不仅仅要做好功能测试&#xff0c;对接口测试的需求也越来越多&#xff01; 所以也越来越多的同学问&#xff0c;怎样才能做好接口测试&#xff1f; 要真正的做好接口测试&#xff0c;并且弄懂如何测试接口&#xff0c;需要从如下几…

HarmonyOS/OpenHarmony应用开发-ArkTS语言渲染控制LazyForEach数据懒加载

LazyForEach从提供的数据源中按需迭代数据&#xff0c;并在每次迭代过程中创建相应的组件。当LazyForEach在滚动容器中使用了&#xff0c;框架会根据滚动容器可视区域按需创建组件&#xff0c;当组件划出可视区域外时&#xff0c;框架会进行组件销毁回收以降低内存占用。一、接…