springboot原理篇-springboot

2024-06-16 07:28

本文主要是介绍springboot原理篇-springboot,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

springboot原理篇-springboot(三)

一、起步依赖

虽然我是直接学习springboot的,没有经历过使用spring开发,但是鉴于我还学习了c++,对依赖这方面真的一言难尽!springboot起步依赖解决依赖问题我实在是羡慕!

直接讲重点:起步依赖的原理就是Maven的依赖传递。

二、自动配置

总所周知,默认情况下,SpringBoot项目在启动的时候会自动的创建IOC容器(也称为Spring容器),并且在启动的过程当中会自动的将bean对象都创建好,存放在IOC容器当中。但我们并不了解这是什么时候添加进去的,如何添加进去的。可能你们会想着,我直接就行了,需要了解原理干什么?这里我只能说,速成能让你快速上手一个项目,但真正觉得能否走远的只会是基础,例如,通过了解这个原理,对后面自己配置依赖有很大帮助,同时让我们在遇到错误时知道错误产生的原因,因此,了解原理还有一个重要原因那就是能提高我们解决问题的能力,如果你连错误产生的原因都不知道,那么解决问题的方法就更无从谈起。

1、概述

​ SpringBoot的自动配置就是当Spring容器启动后,一些配置类、bean对象就自动存入到了IOC容器中,不需要我们手动去声明,从而简化了开发,省去了繁琐的配置操作,以下就是springboot项目在启动时自动添加的bean对象

在这里插入图片描述

前面我们通过学习bean管理可以知道,在我们使用第三方库的时候,是需要导入配置文件的,这些配置文件中定义了我们需要添加的bean对象,如果没有这个配置文件,而仅仅是在pom文件中添加坐标是不行的,那么我们如何导入这个配置文件呢?springboot提供了如下方法

  • 导入 ImportSelector 接口实现类,@Import 通过实现其中的public String[] selectImports函数,获取我们需要添加的所以bean的全类名!这样我们就能知道我们要添加哪些bean了
@Import({TokenParser.class, HeaderConfig.class})
@SpringBootApplication
public class SpringbootWebConfig2Application {
}

但是,通过上述我们发现,如果添加的第三方依赖很多,使用@Import就显得很麻烦,总不能一个一个写吧,于是,springboot有添加了一个新的注释:EnableXxxx注释,里面封装了@Import注释,我们通过追踪启动类的SpringBootApplication注释就能够发现该注释EnableAutoConfiguration

在这里插入图片描述

  • 我们先来看第一个注解:@SpringBootConfiguration

在这里插入图片描述

通过这里,我们就能知道为什么能改启动类中定义第三方bean了,应为启动类就是一个配置类!!!

  • 接下来再先看@ComponentScan注解:

在这里插入图片描述

@ComponentScan注解是用来进行组件扫描的,扫描启动类所在的包及其子包下所有被@Component及其衍生注解声明的类。

SpringBoot启动类,之所以具备扫描包功能,就是因为包含了@ComponentScan注解。

所以通过这里我们就能发现,为什么我们在pom文件中只添加坐标不行,那是因为springboot项目只会扫描启动类所在的包及其子包下所有被@Component及其衍生注解声明的类!

  • 最后我们来看看@EnableAutoConfiguration注解(自动配置核心注解):

在这里插入图片描述

这里我们就能发现,@EnableAutoConfiguration注解里面封装了@Import注解,导入了实现ImportSelector接口的实现类,这样我们就能导入配置类了,通过@EnableAutoConfiguration@ComponentScan两个注解的配合,我们就能添加我们在pom中添加的所有依赖的bean对象!但是我们不知道配置文件在哪里,我们继续跟踪源码

  1. 进入AutoConfigurationImportSelector

在这里插入图片描述

  1. 我们发现AutoConfigurationImportSelector里面实现了selectImports函数,这不正是我们需要的吗!进入getAutoConfigurationEntry

在这里插入图片描述

  1. 进入getCandidateConfigurations

在这里插入图片描述

  1. 成功找到配置文件

在这里插入图片描述

“No auto configuration classes found in META-INF/spring.factories. If you are using a custom packaging, make sure that file is correct.”,这里的META-INF/spring.factories就是一个配置文件,但是呢,在高版本的springboot框架中,还使用了如下META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件,

getCandidateConfigurations方法的功能:

获取所有基于META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件、META-INF/spring.factories文件中配置类的集合

在这里插入图片描述

其中,META-INF/spring.factories貌似在高版本中已经不用了

那么,META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件和META-INF/spring.factories文件这两个文件在哪里呢?

在这里插入图片描述

所有我们就知道在安装依赖的时候,这些配置文件人家已经帮我们弄好了,这样在项目启动的时候,这些配置文件就会被加载,讲对应的bean添加到IOC容器中

在这里插入图片描述

例如,我们查看第三方依赖中提供的GsonAutoConfiguration类:

在这里插入图片描述

在GsonAutoConfiguration类上,添加了注解@AutoConfiguration,通过查看源码,可以明确:GsonAutoConfiguration类是一个配置。

在这里插入图片描述

看到这里,大家就应该明白为什么可以完成自动配置了,原理就是在配置类中定义一个@Bean标识的方法,而Spring会自动调用配置类中使用@Bean标识的方法,并把方法的返回值注册到IOC容器中。

自动配置源码小结

自动配置原理源码入口就是@SpringBootApplication注解,在这个注解中封装了3个注解,分别是:

  • @SpringBootConfiguration
    • 声明当前类是一个配置类
  • @ComponentScan
    • 进行组件扫描(SpringBoot中默认扫描的是启动类所在的当前包及其子包)
  • @EnableAutoConfiguration
    • 封装了@Import注解(Import注解中指定了一个ImportSelector接口的实现类)
      • 在实现类重写的selectImports()方法,读取当前项目下所有依赖jar包中META-INF/spring.factories、META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports两个文件里面定义的配置类(配置类中定义了@Bean注解标识的方法)。

当SpringBoot程序启动时,就会加载配置文件当中所定义的配置类,并将这些配置类信息(类的全限定名)封装到String类型的数组中,最终通过@Import注解将这些配置类全部加载到Spring的IOC容器中,交给IOC容器管理。

这篇关于springboot原理篇-springboot的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1065817

相关文章

Java实现Excel与HTML互转

《Java实现Excel与HTML互转》Excel是一种电子表格格式,而HTM则是一种用于创建网页的标记语言,虽然两者在用途上存在差异,但有时我们需要将数据从一种格式转换为另一种格式,下面我们就来看看... Excel是一种电子表格格式,广泛用于数据处理和分析,而HTM则是一种用于创建网页的标记语言。虽然两

java图像识别工具类(ImageRecognitionUtils)使用实例详解

《java图像识别工具类(ImageRecognitionUtils)使用实例详解》:本文主要介绍如何在Java中使用OpenCV进行图像识别,包括图像加载、预处理、分类、人脸检测和特征提取等步骤... 目录前言1. 图像识别的背景与作用2. 设计目标3. 项目依赖4. 设计与实现 ImageRecogni

Java中Springboot集成Kafka实现消息发送和接收功能

《Java中Springboot集成Kafka实现消息发送和接收功能》Kafka是一个高吞吐量的分布式发布-订阅消息系统,主要用于处理大规模数据流,它由生产者、消费者、主题、分区和代理等组件构成,Ka... 目录一、Kafka 简介二、Kafka 功能三、POM依赖四、配置文件五、生产者六、消费者一、Kaf

Java访问修饰符public、private、protected及默认访问权限详解

《Java访问修饰符public、private、protected及默认访问权限详解》:本文主要介绍Java访问修饰符public、private、protected及默认访问权限的相关资料,每... 目录前言1. public 访问修饰符特点:示例:适用场景:2. private 访问修饰符特点:示例:

详解Java如何向http/https接口发出请求

《详解Java如何向http/https接口发出请求》这篇文章主要为大家详细介绍了Java如何实现向http/https接口发出请求,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 用Java发送web请求所用到的包都在java.net下,在具体使用时可以用如下代码,你可以把它封装成一

SpringBoot使用Apache Tika检测敏感信息

《SpringBoot使用ApacheTika检测敏感信息》ApacheTika是一个功能强大的内容分析工具,它能够从多种文件格式中提取文本、元数据以及其他结构化信息,下面我们来看看如何使用Ap... 目录Tika 主要特性1. 多格式支持2. 自动文件类型检测3. 文本和元数据提取4. 支持 OCR(光学

Java内存泄漏问题的排查、优化与最佳实践

《Java内存泄漏问题的排查、优化与最佳实践》在Java开发中,内存泄漏是一个常见且令人头疼的问题,内存泄漏指的是程序在运行过程中,已经不再使用的对象没有被及时释放,从而导致内存占用不断增加,最终... 目录引言1. 什么是内存泄漏?常见的内存泄漏情况2. 如何排查 Java 中的内存泄漏?2.1 使用 J

JAVA系统中Spring Boot应用程序的配置文件application.yml使用详解

《JAVA系统中SpringBoot应用程序的配置文件application.yml使用详解》:本文主要介绍JAVA系统中SpringBoot应用程序的配置文件application.yml的... 目录文件路径文件内容解释1. Server 配置2. Spring 配置3. Logging 配置4. Ma

Java 字符数组转字符串的常用方法

《Java字符数组转字符串的常用方法》文章总结了在Java中将字符数组转换为字符串的几种常用方法,包括使用String构造函数、String.valueOf()方法、StringBuilder以及A... 目录1. 使用String构造函数1.1 基本转换方法1.2 注意事项2. 使用String.valu

java脚本使用不同版本jdk的说明介绍

《java脚本使用不同版本jdk的说明介绍》本文介绍了在Java中执行JavaScript脚本的几种方式,包括使用ScriptEngine、Nashorn和GraalVM,ScriptEngine适用... 目录Java脚本使用不同版本jdk的说明1.使用ScriptEngine执行javascript2.