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

这篇具有很好参考价值的文章主要介绍了【Springboot】| 从深入自动配置原理到实现 自定义Springboot starter。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【Springboot】| 从深入自动配置原理到实现 自定义Springboot starter,# spring开发,spring boot,后端,java

一. 🦁 前言

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

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

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

2.1 自动配置原理

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

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

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

回到 @SpringbootApplication 注解,其注解组成如下:
【Springboot】| 从深入自动配置原理到实现 自定义Springboot starter,# spring开发,spring boot,后端,java
而@EnableAutoConfiguration则是开启自动配置的核心注解,它由以下注解组成:
【Springboot】| 从深入自动配置原理到实现 自定义Springboot starter,# spring开发,spring boot,后端,java
它通过导入AutoConfigurationImportSelector.class来实现自动配置;
而AutoConfigurationImportSelector类则是基于SpringFactories机制来实现的,现在来看一下它的主要源码:
【Springboot】| 从深入自动配置原理到实现 自定义Springboot starter,# spring开发,spring boot,后端,java
getAutoConfigurationEntry(annotationMetadata)方法如下:
【Springboot】| 从深入自动配置原理到实现 自定义Springboot starter,# spring开发,spring boot,后端,java
我们主要来看一下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的全限定名。其主要流程如下:
【Springboot】| 从深入自动配置原理到实现 自定义Springboot starter,# spring开发,spring boot,后端,java
最后总结一下:
【Springboot】| 从深入自动配置原理到实现 自定义Springboot starter,# spring开发,spring boot,后端,java

这里狮子是学习了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),如下:

【Springboot】| 从深入自动配置原理到实现 自定义Springboot starter,# spring开发,spring boot,后端,java

3.3 添加相关依赖

先添加Lombokspring-boot-starter-mail Spring Confguration Processor依赖(很重要,后面会体现它的价值);
【Springboot】| 从深入自动配置原理到实现 自定义Springboot starter,# spring开发,spring boot,后端,java

3.4 删除一些不需要的东西

  1. 测试依赖
    【Springboot】| 从深入自动配置原理到实现 自定义Springboot starter,# spring开发,spring boot,后端,java
  2. 打包插件
    【Springboot】| 从深入自动配置原理到实现 自定义Springboot starter,# spring开发,spring boot,后端,java
  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 的文件。
    【Springboot】| 从深入自动配置原理到实现 自定义Springboot starter,# spring开发,spring boot,后端,java
  2. 文件里面的内容为(写法很单一,cv即可):
# spring boot starter
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.lion.emailstarter.LionEmailConfig

3.8 目录结构展示

【Springboot】| 从深入自动配置原理到实现 自定义Springboot starter,# spring开发,spring boot,后端,java

3.9 打包

如下:
【Springboot】| 从深入自动配置原理到实现 自定义Springboot starter,# spring开发,spring boot,后端,java
【Springboot】| 从深入自动配置原理到实现 自定义Springboot starter,# spring开发,spring boot,后端,java
显示成功则说明该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的缘故,自动生成配置的代码提示。
    【Springboot】| 从深入自动配置原理到实现 自定义Springboot starter,# spring开发,spring boot,后端,java
  2. 测试
@SpringBootTest
class LionTelecomsApplicationTests {

    @Autowired
    private MailUtils mailUtils;

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

  1. 测试结果
    【Springboot】| 从深入自动配置原理到实现 自定义Springboot starter,# spring开发,spring boot,后端,java

五. 🦁 总结

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


【Springboot】| 从深入自动配置原理到实现 自定义Springboot starter,# spring开发,spring boot,后端,java

🦁 其它优质专栏推荐 🦁

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

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

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

更多文章可持续关注上方🦁的博客,2023咱们顶峰相见!文章来源地址https://www.toymoban.com/news/detail-676920.html

到了这里,关于【Springboot】| 从深入自动配置原理到实现 自定义Springboot starter的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringBoot Starter机制 ——自动化配置

    目录 一、Starter机制 1.1 什么是 SpringBoot Starter 1.2 SpringBoot Starter 的作用 1.3 Starter的应用场景 二、案例 2.1 模拟短信发送模版 2.2 AOP实现日志切面模版         Spring Boot Starter是Spring Boot框架提供的一种便利机制,用于简化项目的依赖管理和配置。它是一组预定义的依赖项和

    2024年02月03日
    浏览(41)
  • SpringBoot使用Druid连接池 + 配置监控页面(自定义版 + starter版)

    全方位监控、防SQL注入攻击等 添加druid连接池的依赖,如下所示: 说明如下: @ConfigurationProperties(prefix = “spring.datasource”)注解,将以spring.datasource开头的配置和DataSource类进行绑定,就可以在application.properties对DataSource的属性进行设置了 druidDataSource.setFilters(“stat,wall”):开启

    2024年02月05日
    浏览(41)
  • 003 第一季SpringBoot2核心技术-核心功能2:数据访问、单元测试、指标监控、原理解析:@Value、命令行参数、手动获取bean、自定义starter

    说明 :在SpringBoot中想要操作数据库完成增删改差,按照以往的经验: 原理 : 首先 导入数据开发的场景starter(依赖)---- 这个场景会又会自动导入数据库相关的配置类---- 这个配置类又会导入相关的组件,如:数据源----》 数据源组件中又有相关的数据库配置项:用户名、密码

    2024年01月22日
    浏览(40)
  • SpringBoot+jasypt-spring-boot-starter实现配置文件明文加密

    springboot:2.1.4.RELEASE JDK:8 jasypt-spring-boot-starter:3.0.2 Jasypt默认算法为PBEWithMD5AndDES,该算法需要一个加密密钥,可以在应用启动时指定(环境变量)。也可以直接写入配置文件 3.1 application.properties配置文件版 加密后,可删除jasypt.encryptor.password配置;发版时可在命令行中配置 3.2 函数

    2024年02月15日
    浏览(42)
  • SpringBoot(十)SpringBoot自定义starter

        一个月的时间,转眼已经到了我的SpringBoot系列的第十篇文章。还记得我的第二篇文章SpringBoot(二)starter介绍_springboot的starter_heart荼毒的博客-CSDN博客 曾经介绍过starter。starter除了官方提供的以外,我们也可以自定义。本篇,就介绍下如何自定义一个工具类的starter。  

    2024年02月14日
    浏览(32)
  • SpringBoot自定义starter

    参考文章:SpringBoot自定义starter_springboot3.0自定义starter_kksilu的博客-CSDN博客 我这里是根据上面博主的文章做的练习   DemoService: DemoConfig: Spring.factories: 安装到maven仓库 在application.properties中添加配置: 启动类测试: 最后就可以看到,控制台输出    DemoService{demo=\\\'123\\\'}    了

    2024年02月12日
    浏览(43)
  • SpringBoot之自定义starter

    目录 一、什么是SpringBoot starter机制 二、为什么要自定义starter 三、什么时候需要创建自定义starter 四、自动加载核心注解说明 五、自定义starter的开发流程 案例一:为短信发送功能创建一个starter 案例二:AOP方式统一服务日志 SpringBoot中的starter是一种非常重要的机制(自动化配

    2024年02月01日
    浏览(42)
  • SpringBoot中自定义starter

    一、在线创建 首先打开 https://start.spring.io 这个网站,如下: 项目构建工具是 Maven 还是 Gradle ?有人用 Gradle 做 Java 后端项目,但是整体感觉 Gradle 在 Java 后端中使用的还是比较少,Gradle 在 Android 中使用较多,Java 后端,目前来看还是 Maven 为主,因此这里选择第一项。 开发语

    2024年02月10日
    浏览(47)
  • 自定义一个springboot starter

    在我们的日常开发工作中,经常会有一些独立于业务之外的配置模块,比如阿里云oss存储的时候,我们需要一个工具类进行文件上传。我们经常将其放到一个特定的包下,然后如果另一个工程需要复用这块功能的时候,需要将代码硬拷贝到另一个工程,重新集成一遍,这样会

    2024年02月05日
    浏览(35)
  • 【实战】SpringBoot自定义 starter及使用

    各位大佬在使用springboot或者springcloud的时候都会根据需求引入各种starter,比如gateway、feign、web、test等等的插件。当然,在实际的业务场景中也会有将第三方组件整合为starter供其他项目接入。那么,我们今天就分享一波SpringBoot自定义 Starter及使用。 SpringBoot starter简介 starter是

    2024年01月22日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包