解密Spring Boot Starter与自动配置:探秘神奇的背后

starter可以理解为Spring Boot中的一站式集成启动器,包含了一系列可以集成到应用中的依赖项,可以快递集成spring组件及其框架,而不需要到处找示例代码。

一、为什么要用starter?

在springboot还没有出来之前,我们使用spring开发项目,如果程序需要连接数据库,我们一般会使用Hibernate或者Mybatis等orm框架。

使用mybatis框架操作步骤:

  • 到maven仓库找到需要引入的mybatis的jar包,选择合适的版本

  • 到maven仓库找到mybatis-spring整合的jar包,选择合适的版本

  • 在spring的application.xml文件中配置dataSource和mybatis相关信息

过程非常繁琐,并且需要选择合适的版本,否则会出现版本冲突等一系列问题。而SpringBoot为了解决以上两个问题引入了starter机制。我们只需要通过简单的配置就可以使用,“开箱即用”。

一个完整的Spring Boot Starter 一般需要包含一下组件:

  • 完成自动配置的自动装配模块

  • 为自动装配模块提供的所有依赖项。

简而言之,就是添加一个Starter应该提供使用该starter需要的一切,比如我们想使用spring jap访问数据库,只需要加入官方提供的spring-boot-starter-data-jap启动依赖即可。

SpringBoot提供了很多开箱即用的Starter,大概有近50中,其中常用的如下:

二、SpringBoot的自动配置原理

在导入starter之后,SpringBoot主要帮我们完成了两件事情

  • 相关组件的自动导入

  • 相关组件的自动配置

这两件事情统一成为SpringBoot的自动配置

​自动配合原理:

我们从主程序入口来探索下整个过程的原理:

@SpringBootApplication //标注这个类是一个springboot的应用public class CommunityApplication {    public static void main(String[] args) {        //将springboot应用启动        SpringApplication.run(CommunityApplication.class, args);    }}

@SpringBootApplication注解内部结构如下图所示

AutoConfigurationImportSelector :重点看该类中重写的selectImports方法,看下它返回的字符串数组是如何得来的:

我们可以去到上边提到的spring.factories文件中去看一下,找到spring官方提供的spring-boot-autoconfigure包,在其下去找一下该文件:

@SpringBootApplication注解内部结构如下图所示:

AutoConfigurationImportSelector :重点看该类中重写的selectImports方法,看下它返回的字符串数组是如何得来的:

我们可以去到上边提到的spring.factories文件中去看一下,找到spring官方提供的spring-boot-autoconfigure包,在其下去找一下该文件:

可以看到这个就是SpringBoot官方为我们提供的所有自动配置类的候选列表。我们可以在其中找到一个我们比较熟悉的自动配置类去看一下它内部的实现:

可以看到这些一个个的都是JavaConfig配置类,而且都通过@Bean注解向容器中注入了一些Bean

结论:

  • SpringBoot在启动的时候从类路径下的 META-INF/spring.factories中获取EnableAutoConfiguration指定的所有自动配置类的全限定类名

  • 将这些自动配置类导入容器,自动配置类就生效,帮我们进行自动配置工作;

  • 整个J2EE的整体解决方案和自动配置都在 spring-boot-autoconfigure的jar包中;

  • 它会给容器中导入非常多的自动配置类 (xxxAutoConfiguration), 就是给容器中导入这个场景需要的所有组件,并配置好这些组件;

​Spring Boot自动装配使用总结:

  • Spring Boot启动会加载大量的自动配置类,可以开一下加载的默认配置类当中有没有我们需要的配置,只要我们要的组件从在其中,我们就不需要在手动配置了。

  • 给容器中自动配置添加组件的时候,会从properties类中获取某些属性,​我们只需要在配置文件中指定这些属性即可。

 注:喜欢的朋友可以关注公众号“JAVA学习课堂”方便阅读,内容同步更新。

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

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

相关文章

大模型分布式训练并行技术分享

目前业内解决大模型问题,基本以多节点、分布式方案为主。分布式方案具体的实施时,又分为数据并行、参数并行、流水线并行等,针对具体的业务场景采取合适的并行方案方可带来更高的效率。 后续结合业内主流的分布式框架,具体介绍各种…

半规管功能减退引起头晕怎么治?

“头晕一年多,刚开始挺轻的,然后就是一个阶段一个阶段的,越来越严重了,就是感觉自己晃,比如说坐椅子,带靠背的,坐着或者站着觉得就是晃,坐车时间长了晕的就更厉害了,然后…

Vue3解决“找不到模块“@/components/xxx.vue”或其相应的类型声明”

文章目录 前言背景问题描述解决方案总结 前言 在使用 Vue 3 开发项目时,遇到“找不到模块 ‘/components/xxx.vue’ 或其相应的类型声明”的错误是一个常见问题。这通常与 TypeScript 和模块解析相关的配置不当有关。本文将详细介绍如何解决此问题,确保…

重生奇迹MU格斗家上手最轻松的职业

重生奇迹MU格斗家玩法攻略,有一个比较奇葩的职业,那就是格斗家。格斗家拥有其他职业没有的优势,就是加体力和敏捷都可以提升攻击力百分比。格斗家玩法攻略 目前格斗家最多的就是敏格玩法,配合智力MM加成后的幽冥光速拳可以说是第…

详解布隆过滤器(含面试考点)

Bloom Filter 底层逻辑主要代码实现解析(以C为例)优缺点应用场景面试常问问题1:什么是布隆过滤器?问题2:布隆过滤器如何处理误报?问题3:如何设计布隆过滤器以最小化误报率?问题4&…

Cobaltstrike框架介绍

Cobaltstrike简介 cobalt strike(简称CS)是一款团队作战渗透测试神器,分为客户端及服务端,一个服务端可以对应多个客户 端,一个客户端可以连接多个服务端,可被团队进行分布式协团操作. 和MSF关系 metas…

Java使用apache.poi生成word

加油,打工人! 工作需求,将现有的word模板有段落和表格,从数据库中查出数据并填充,word里面也有表格数据,需要将excel表格数据单独处理,然后插入到生成好的word文档中。 下面代码模拟从数据库查出…

【简单易用,新人友好】一个轻量级生物信息学流程框架,从此解决99%的生物信息学流程搭建问题...

生物信息学数据分析流程的搭建是一项繁重而复杂的工作。随着行业的发展,各种生信流程框架层出不穷,比如有: NextflowSnakemakeCWLWDL 各种标准,各种规则,令人眼花缭乱。选择太多,往往令人无所适从。特别是新进入行业的…

SwiftUI中的Stepper(系统Stepper以及自定义Stepper)

本篇文章主要介绍一下Stepper,这个组件在UIKit中也已经有较长的历史了,下面看看在SwiftUI中如何使用,有哪些更加便捷的方法呢? Stepper减号(-)和加号()按钮,可以点击后以指定的数值进行加减。 基础初始化方法 Stepp…

NDIS驱动开发-NET_BUFFER体系

网络数据由通过网络发送或接收的数据包组成。 NDIS 提供数据结构来描述和组织此类数据。 NDIS 6.0 及更高版本的主要网络数据结构包括: NET_BUFFERNET_BUFFER LISTNET_BUFFER_LIST_CONTEXT 它们之间的关系如下: 在 NDIS 6.0 及更高版本中, NET_BUFFER …

基于python数据挖掘在淘宝评价方面的应用与分析,技术包括kmeans聚类及情感分析、LDA主题分析

随着电子商务的蓬勃发展,淘宝作为中国最大的在线购物平台之一,吸引了大量的消费者进行购物并留下了大量的客户评价。这些客户评价中包含了丰富的消费者意见和情感信息,对于商家改进产品、提升服务质量以及消费者决策都具有重要的参考价值。 …

一个机器学习问题的重新定义

任何事物都有两面性。 一些机器学习问题也是如此。并非每个回归问题(你认为的)都需要回归。仔细考虑和审视问题的业务不仅可以帮助开发更好的模型,还可以找到有效的解决方案。 重构或重新定义(reframing)是一种改变机…

数据结构-思考完全二叉树

我们知道在完全二叉树中 : (孩子下标-1)/ 2 父节点下标 父节点下标*21 左孩子节点 父节点下标*22 右孩子节点 那我们该怎样理解以便之后不容易忘记呢? 以下是我的思考过程:观察下边的完全二叉树的下标规律…

Docker HTTPS api V2 Manifest V 2, Schema 2 下的免装docker下载镜像的方法

目录 前言 下载镜像代码 使用方法 原代码中无法适配 Schema 2 的原因浅析 如何解决 相对原代码改动的东西 前言 本文提供代码主要是基于 https://github.com/NotGlop/docker-drag 提供的代码修改的。链接中提供的代码应该是是基于HTTPS api V2 Manifest V 2, Schema 1实…

如何使用pycrypt加密工具测试反病毒产品的检测性能

关于pycrypt pycrypt是一款基于Python 3语言开发的加密工具,广大研究人员可以使用该工具来尝试绕过任意类型的反病毒产品,以检测目标反病毒产品的安全性能。 功能介绍 1、目前已知反病毒产品检测率为0/40; 2、支持绕过任意EDR解决方案&#…

Nodejs+Socket.io+Web端完成聊天

前言 源码获取:nodeexpresssocket.ioweb: 聊天demo (gitee.com) 目录结构 后端依赖 启动方式 前端是html正常启动 后端是node app.js 后端app.js核心代码 const express require(express) const app express() var http require(http).Server(app) var io require(so…

AI网络爬虫-自动获取百度实时热搜榜

工作任务和目标&#xff1a;自动获取百度实时热搜榜的标题和热搜指数 标题&#xff1a;<div class"c-single-text-ellipsis"> 东部战区台岛战巡演练模拟动画 <!--48--></div> <div class"hot-index_1Bl1a"> 4946724 </div> …

uniapp+vue3+ts开发小程序或者app架构时候的UI框架选型

使用vue3tsviteuniapp开发小程序或者跨平台app的趋势越来越高&#xff0c;有一个顺手的UI的框架还是非常重要的&#xff0c;官方维护的 uni-ui&#xff0c;支持全端&#xff0c;而且有类型提示&#xff0c;目前已经内置到 GitHub - Sjj1024/uniapp-vue3: 使用uniapp和vue3 ts …

01-05.Vue自定义过滤器

目录 前言过滤器的概念过滤器的基本使用给过滤器添加多个参数 前言 我们接着上一篇文章01-04.Vue的使用示例&#xff1a;列表功能 来讲。 下一篇文章 02-Vue实例的生命周期函数 过滤器的概念 概念&#xff1a;Vue.js 允许我们自定义过滤器&#xff0c;可被用作一些常见的文本…

Photoshop插件(UXP)编写过程中,如何更新sp-checkbox的选中状态

✨问题说明 sp-checkbox是uxpSpectrum UXP Widgets下的一个小组件&#xff0c;内置样式大概是这样&#xff1a; 那么&#xff0c;如果用js动态的改变选中的状态&#xff0c;应该如何做呢&#xff1f; 如果直接是html来写&#xff1a; <sp-checkbox checked>Checked<…