SpringBoot——原理(起步依赖+自动配置(概述和案例))

news2024/11/26 20:48:49

在Spring家族中提供了很多优秀的框架,所有的框架都是基于同一个基础框架——Spring Framework.

使用spring框架开发麻烦的一批,光是搞依赖和配置就够人喝一壶了。因此在spring4.0版本之后又推出了springboot框架。springboot框架用起来比spring框架简单的多了。

 在springboot的底层提供了两个重要的功能。

起步依赖——简化了pom文件中依赖的配置,解决了依赖配置繁琐的问题。

自动配置——简化了bean的声明以及bean的配置。

起步依赖原理

使用spring开发时用到什么就需要引入什么依赖,比如进行web开发要webmvc的依赖,servlet的依赖,json的依赖,用到aop还要引aop的依赖。

 在springboot当中要进行web开发只需要引入一个web开发的起步依赖

spring-boot-starter-web,如果有aop的需求就引入spring-boot-starter-aop。

Maven依赖传递

这里利用maven的依赖传递,springboot提供的起步依赖当中就提供了当前程序开发需要的所有常见依赖,如spring-boot-starter-web中就有了web开发的所有常见依赖

自动配置原理

 研究自动配置就是在研究引入了依赖之后以如何把依赖的jar包里面的bean对象以及配置注入到本项目的IOC容器当中去的。 在下面运行的项目工程中,运行之后可以看见Bean里面有一个appliction,里面放着的就是所有的这个项目中所有bean对象,在没有高亮的bean对象里面可以看见我在项目中自己添加注解的bean对象,有Controller层的,有Mapper层的,还有一个Service层的,其他的高亮的Bean对象应该就是依赖包里面定义好的bean对象,在项目运行时自动加载进来。 

面试当中问SpringBoot的原理就是在问自动配置的原理

模拟案例

如上图所示,准备两个项目,其中一个模拟外部的依赖jar包

项目结构图如下所示

在我们的项目工程中要使用第三方提供的项目依赖就要将其坐标导入进去。上图中画红圈的地方就是上面那个项目坐标。

 例如在模拟第三方的项目中有一个HeaderConfig类,其自身加了一个Configguration注解表明其实一个配置类,里面有两个Bean对象。

在下面的正式项目的测试类当中进行测试

在test目录下有一些测试方法如下所示,定义了一个IOC容器用来获取第三方的Bean对象。

报错

 直接运行测试后会报错显示没有找到这个类型的Bean对象

 三个都是会报同一个错误。

说明导入的第三方的Bean和配置类没有生效。

原因:没有被组件扫描扫到。

在项目的启动类的注解@SpringBootApplication注解具有包扫描的作用,但是它的作用范围只到当前包以及它的子包。

当前包就是itheima.

解决方案(1)(不推荐:):

通过一个注解@ComponentScan组件扫描进行指定包的扫描

 这里不仅要选择要扫描的第三方包,还要指定当前包,因为一旦显示指定扫描区域,原来默认扫描的区域会被覆盖。

因此加上上面的注解之后再次运行测试就可以成功拿到IOC容器中的Bean对象。

另外的那些Bean对象也可以成功获取。

解决方案(2):

通过上面的解决方案1我们会发现,如果引入其他很多比如mybatis,lombok之类的以来都要这样用componentscan注解扫描的话会多出很多要扫描的包。但是很明显没有这么做

 

通过import导入的所有类都会自动加入IOC容器中。

导入普通类

即使这个类本身没有加任何注解也是可以的

在测试类当中可以成功获取其Bean对象。

导入配置类

这个会将该配置类下所有Bean对象放入IOC容器当中

在测试类当中可以成功获取其Bean对象。两个都可以成功获取到

 

导入ImportSelector接口的实现类

这个接口下有一个selectImports的方法返回一个String[]数组,里面都是需要交个IOC容器管理的类的全类名。 

在下面实现这个接口后往里面放一个配置类的全类名,也就是这个配置类会被注入到IOC容器当中 

 进行导入测试 

 在测试类当中调试输出可以获得配置类下的两个Bean对象

但是在使用这种方式导入时还是要清楚的知道这个第三方依赖有哪些个selectImports接口的实现类。只有第三方依赖自己知道自己有哪些类,所以要在第三方依赖当中定义一个注解把自己本身selectImports接口的所有实现类都放进去,然后我们的项目中直接只加个注解即可。

使用@Enablexxxx注解(SringBoot内部采用的方式)

比如下面这个EnableHeaderConfig注解,已经把自己内部selectImports的实现类放进去了。

所以直接在我们的项目中使用这个注解即可

 调试输出可以获取到第三方中的Bean对象。

 

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

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

相关文章

chatgpt赋能python:Python行长度的重要性及最佳实践

Python 行长度的重要性及最佳实践 Python 行长度的重要性 对于一门编程语言而言,行长度是指每一行代码的字符数,Python 也不例外。同时,Python 的行长度限制也是相当明确的,官方建议不要超过 79 个字符,而 PEP 8 规范…

【编译、链接、装载一】预处理、编译、汇编、链接

【编译和链接一】预处理、编译、汇编、链接 一、被隐藏了的过程二、预处理器(Prepressing)——cpp1、预处理指令2、预处理过程3、预处理生成的hello.i文件 三、编译器(Compilation)——cc1、编译指令2、编译的过程3、编译生成的文…

chatgpt赋能python:Python读取Mat文件的完整教程

Python 读取Mat文件的完整教程 在数据科学领域,Matlab(或简称Mat)是最受欢迎的编程语言之一。Matlab可用于数学计算、数据预处理、建模和数据分析。然而,Matlab的开销和许可证成本会限制公司和个人的使用。因此,Pytho…

渗透必学神器:BurpSuite教程(一)

0x00 前言 Burp Suite (简称BP,下同)是用于攻击web 应用程序的集成平台。它包含了许多工具,并为这些工具设计了许多接口,以促进加快攻击应用程序的过程。 从本节开始将为大家陆续带来BP各个模块的使用说明 0x01 中间人攻击 中间人攻击&am…

ChatGPT | Bing | Google Bard | 讯飞星火 | 到底哪家强?实测

最近AIGC战场依然热闹,微软的new bing、Google的Bard、国内的讯飞星火认知大模型,都接连上阵,我们对比ChatGPT一起来看看,我把实际使用测试结果发出,供大家参考。有些测试结果可能会出乎大家的预料哦… 今天我们暂时主…

第十四章 (Set)

一、Set 接口(P518) 1. Set 接口基本介绍 (1)无序(添加和取出的顺序不一致),没有索引。 (2)不允许重复元素,所以最多包含一个 null。 2. Set 接口的常用方法…

阿里云服务器ECS云盘扩容

前言 对于云服务器,相信大多数开发的铁子们都玩过,但是云盘爆满的情况,对于新手或者没有自己运营业务的铁子们,平台给的初始容量也不算小,所以这种情况碰到的概率还是比较小。由于我的服务器应用的复杂度随着业务的发…

ubuntu安装搜狗输入法,图文详解+踩坑解决

搜狗输入法已支持Ubuntu16.04、18.04、19.10、20.04、20.10,本教程系统是基于ubuntu18.04 一、添加中文语言支持 系统设置—>区域和语言—>管理已安装的语言—>在“语言”tab下—>点击“添加或删除语言”。 弹出“已安装语言”窗口,勾选中文…

chatgpt赋能python:Python在SEO领域的优势

Python在SEO领域的优势 Python作为一种高效、灵活的编程语言,已经被广泛应用于多个领域,包括Web应用、数据科学、自然语言处理等。在SEO领域,Python也有其独特的优势。 爬虫 Python强大的爬虫库和框架,如BeautifulSoup、Scrapy…

chatgpt赋能python:Python行列转换教程:如何轻松实现行列转换

Python行列转换教程:如何轻松实现行列转换 在数据处理和分析中,经常需要将行和列进行转换。Python是一种优秀的编程语言,提供了多种方法来实现行列转换。在本教程中,我们将介绍如何使用Python实现行列转换,并提供简单…

《Spring Guides系列学习》guide66 - guide68及小结

要想全面快速学习Spring的内容,最好的方法肯定是先去Spring官网去查阅文档,在Spring官网中找到了适合新手了解的官网Guides,一共68篇,打算全部过一遍,能尽量全面的了解Spring框架的每个特性和功能。 接着上篇看过的gui…

深入了解Golang中的反射机制

目录 反射 反射的分类 值反射 类型反射 运行时反射 编译时反射 接口反射 结构体反射 常用函数 值反射 类型反射 值反射和类型反射的区别 结构体反射 示例代码 反射 反射是指在程序运行时动态地检查和修改对象的能力。在Go语言中,通过反射可以在运行时…

chatgpt赋能python:Python逆序对:什么是逆序对,如何使用Python进行逆序对计算?

Python逆序对&#xff1a;什么是逆序对&#xff0c;如何使用Python进行逆序对计算&#xff1f; 在计算机科学中&#xff0c;逆序对是指在一个数组中&#xff0c;如果存在下标i < j&#xff0c;但是a[i] > a[j]&#xff0c;则a[i]和a[j]构成一个逆序对。逆序对对于理解和…

pthread多线程:传入参数并检查 data race

文章目录 1. 目的2. 给子线程传入参数&#xff1a;万能类型 void*3. data race3.1 什么是 data race3.2 怎样检测 data race 4. data race 的例子4.1 子线程传入同一个 data4.2 使用栈内存 5. 解决 data race 问题5.1 忽视问题&#xff1f;5.2 避开同一个变量的使用5.3 使用互斥…

Office project 2010安装教程

哈喽&#xff0c;大家好。今天一起学习的是project 2010的安装&#xff0c;Microsoft Office project项目管理工具软件&#xff0c;凝集了许多成熟的项目管理现代理论和方法&#xff0c;可以帮助项目管理者实现时间、资源、成本计划、控制。有兴趣的小伙伴也可以来一起试试手。…

每天一道面试题之String str=“i“与 String str=new String(“i”)一样吗?

String str"i"与 String strnew String(“i”)一样吗&#xff1f; 要想知道二者是否一样&#xff0c;我们只需要通过进行比较&#xff0c;为什么不用equals的原因&#xff0c;大家可以认真阅读这篇文章 测试代码如下&#xff1a; public class Test1 {public stati…

chatgpt赋能python:Python选择器:优化你的SEO

Python 选择器&#xff1a;优化你的SEO 介绍 随着搜索引擎优化(SEO)变得越来越重要&#xff0c;Web 开发人员需要采取各种措施来提高网站的搜索排名。其中之一就是通过使用正确的 HTML 标签和优秀的内容来提高搜索引擎爬虫对网站的理解。这时候 Python 选择器就变得尤为重要。…

chatgpt赋能python:Python选择函数

Python 选择函数 Python是一种流行的编程语言&#xff0c;是许多开发人员的首选。在Python中&#xff0c;有许多函数可供开发人员使用。这些函数不仅提高了开发的速度&#xff0c;而且还可以帮助我们更快地解决许多问题。在本文中&#xff0c;我们将重点介绍Python选择函数。 …

iostat详解

iostat在centOS中默认没有 安装 yum install sysstat 使用 iostat -dxk 5 rrqm/s 每秒进入队列的合并读写请求数 wrqm/sr/s每秒发送到设备的读写请求数w/srKB/s每秒读写的吞吐量&#xff0c;单位KBwKB/savgrq-sz 以扇区为大小的请求大小 avgqu-sz设备队列中等待的请求数await在…

HNU-电路与电子学-综合设计-模型机

写在前面&#xff1a; 每一年的综合设计肯定都有改动&#xff0c;故肯定不能照搬照抄&#xff0c;大家可以借鉴思路&#xff0c;复现成果&#xff0c;但要注意不同之处&#xff0c;以免被0分处理。 模型设计的指导书我不放在这里了&#xff0c;因为那是课程组老师们的成果。 …