SpringBoot自动配置原理分析

news/2024/11/28 20:00:33/

前言:

       虽然工作中一直使用的是自研的一款基于spring的框架,但是随着springboot在各公司的广泛使用,公司的一些新项目也开始逐渐使用springBoot了,那么springBoot的一些特性就要仔细学习一下了。

什么是自动配置?

        还记得之前使用springMVC的时候吗,不管是自动定义的bean类,还是从jar包中定义好的bean类都要手动配置到xml文件或者使用@service、@Component等注释来进行装配,装配的意思就是委托给spring去管理这些类。比如之前spring整合mybatis时,除了引入依赖包还要在spring.xml中配置一个SessionFactory和mapperScanne两个bean。但是在使用springboot时发现根本没有这项操作,而且导入的包也不一样了,springBoot导入的包就叫mybatis-xxx.jar,而springBoot引入的是mybatis-spring-boot-starter.jar。
        那么什么是自动配置呢?就如上面所说的不需要手动添加任何内容就可以自动完成Bean的注册。

自动配置的原理是什么?

自动配置主要依赖于@SpringBootApplication注解 + xxx-spring-boot-starter.jar来完成。
springBoot项目初始化的时候会根据配置的@SpringBootApplication注解去自动扫描所有jar包中的spring.factories文件,然后将spring.factories中定义的EnableAutoConfiguration自动装配类中的bean装配到spring容器中。

jar包中的spring.factories文件是哪里来的呢

springboot官方提供了多种jar,命名规则为sping-boot-starter-xxx.jar,这类jar直接拿来即用,另一种需要使用者根据实际情况去封装,那么封装有几个规则且必须遵守:
1、命名需要符合(建议)xxx-spring-boot-starter.jar
2、目录中resource下的META-INFO下需要包含spring.factories文件
3、spring.factories需要指明自动配置类:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\xxxxxx

4、xxxx配置类需要添加@Configuration注解,并且完成待自动注入类的初始化。

以上4点就是开发者自己封装一个starter的所有过程,那么这样就可以理解jar包中的spring.factories文件是从哪里来的了。当然配置自动注入还有其他方式,比如自定义@EnableXXX注解来实现。

如下:

image.png

其他方式实现自动配置

使用这种方式去做自动配置,不需要创建spring.factories,但是需要自定义注解来实现AutoConfiguration,如何实现呢,需要在自定义注解中添加@Import(xxx.class), xxx.java中需要实现ImportSelect接口并且实现selectImports方法来指定自定义配置类。
但是在使用的时候就需要手动添加自定义注解到xxxApplication上了。
如下:

自定义注解:
image.png
指定自动配置类
image.png

综上就是springboot自动配置的原理,下一篇从代码的角度分析一下如何实现的自动配置。

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第16天,点击查看活动详情


http://www.ppmy.cn/news/47768.html

相关文章

找零问题1-最少硬币

文章目录 找零问题1-最少硬币程序设计程序分析找零问题1-最少硬币 【问题描述】 给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。(你可以认为硬币的数量是无限的) 【…

蓝桥杯欲伸手CTF?有多远爬多远

注意:网络安全类比赛 或者说 CTF 参赛不会需要任何费用 只有国赛/省赛有可能会收取一定运维费用 其他比赛都不会收费 望周知。 先来看个特离谱的事情 早上起床看到几位师傅的朋友圈一脸懵,再仔细一看,好嘛。。。。。。 先看看探姬的回复 接下…

不邻接植花

题目描述 有 n 个花园,按从 1 到 n 标记。另有数组 paths ,其中 paths[i] [xi, yi] 描述了花园 xi 到花园 yi 的双向路径。在每个花园中,你打算种下四种花之一。 另外,所有花园 最多 有 3 条路径可以进入或离开. 你需要为每个…

javaScript---js如何实现继承

目录 1、构造函数继承 2、原型链继承 3、组合继承 4、class继承 5、寄生组合继承 JavaScript 是以对象为基础,以函数为模型,以原型为继承的面向对象开发模式。 javascript继承的作用: 可以不调用“父类”的构造方法就创造新的实例&…

设计模式-结构型模式之桥接模式

2. 桥接模式 2.1. 模式动机 设想如果要绘制矩形、圆形、椭圆、正方形,我们至少需要4个形状类,但是如果绘制的图形需要具有不同的颜色,如红色、绿色、蓝色等,此时至少有如下两种设计方案: 第一种设计方案是为每一种形状…

js面试题

在全局作用域下声明了一个变量 arr, 它的初始值是一个空数组 第二段代码,循环计数器变量i的初始值为0,循环条件是i的值小于2, 也就是说当i的值为0或者1时, 循环条件才能成立 才能够进入到循环体 当i的值为2时循环条件不成立&…

ctfshow愚人杯web复现

easy_signin 题目url base64解码是face.png&#xff0c;尝试flag.txt和flag.php&#xff0c;base64加密后传入都不对&#xff0c;用index.php加密后传入&#xff0c;看源码 将后面的base64解密得到flag 被遗忘的反序列化 源码 <?php# 当前目录中有一个txt文件哦 error_r…

Linux FTP服务

FTP服务 作用 传输文件 端口 FTP服务器默认使用TCP协议的20、21端口与客户端进行通信 20端口用于建立数据连接&#xff0c;并传输文件数据 21端口用于建立控制连接&#xff0c;并传输FTP控制命令 模式 FTP数据连接分为主动模式和被动模式 主动模式&#xff1a;客户端告诉服务端…