springboot自动配置

devtools/2024/10/9 4:20:22/
自动配置的核心就在@SpringBootApplication注解上,SpringBootApplication这个注解
底层包含了3个注解,分别是:
@SpringBootConfiguration
@ComponentScan
@EnableAutoConfiguration
@EnableAutoConfiguration这个注解才是自动配置的核心,它 封装了 @Import 注解( Import 注解中指定了一个 ImportSelector接口的实现类,重写了 selectImports()方法
在实现类重写的 selectImports() 方法,读取当前项目下所有依赖 jar 包中
META-INF/spring.factories
        
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
两个文件里面定义的配置类(配置类中定义了 @Bean 注解标识的方法)。
而selectImports()方法中会去读取两份配置文件,并将配置文件中定义的配置类做为
selectImports()方法的返回值返回,返回值代表的就是需要将哪些类交给Spring的IOC
容器进行管理。
那么所有自动配置类的中声明的bean都会加载到Spring的IOC容器中吗? 其实并不会,因
为这些配置类中在声明bean时,通常都会添加@Conditional开头的注解,这个注解就是进
行条件装配。而Spring会根据Conditional注解有选择性的进行bean的创建。
@Enable 开头的注解底层,它就封装了一个注解 import 注解,它里面指定了一个类,是
ImportSelector 接口的实现类。在实现类当中,我们需要去实现 ImportSelector
接口当中的一个方法 selectImports 这个方法。这个方法的返回值代表的就是我需要将
哪些类交给 spring 的 IOC容器进行管理。
此时它会去读取两份配置文件,一份儿是 spring.factories,另外一份儿是
autoConfiguration.imports。而在 autoConfiguration.imports 这份儿文件
当中,它就会去配置大量的自动配置的类。
而前面我们也提到过这些所有的自动配置类当中,所有的 bean都会加载到 spring 的 IOC 容器当中吗?其实并不会,因为这些配置类当中,在声明 bean 的时候,通常会加上 这么一类@Conditional 开头的注解。这个注解就是进行条件装配。
所以SpringBoot非常的智能,它会根据 @Conditional 注解来进行条件装配。只有条件成立,它才会声明这 个bean,才会将这个 bean 交给 IOC 容器管理。
@Conditional
我们在跟踪SpringBoot自动配置的源码的时候,在自动配置类声明bean的时候,除了在方法上加了一
个@Bean注解以外,还会经常用到一个注解,就是以Conditional开头的这一类的注解。以
Conditional开头的这些注解都是条件装配的注解。下面我们就来介绍下条件装配注解。
@Conditional注解:
作用:按照一定的条件进行判断,在满足给定条件后才会注册对应的bean对象到Spring的IOC容
器中。
位置:方法、类@Conditional本身是一个父注解,派生出大量的子注解:
@ConditionalOnClass:判断环境中有对应字节码文件,才注册bean到IOC容器。
@ConditionalOnMissingBean:判断环境中没有对应的bean(类型或名称),才注册
bean到IOC容器。
@ConditionalOnProperty:判断配置文件中有对应属性和值,才注册bean到IOC容器。

http://www.ppmy.cn/devtools/123187.html

相关文章

Android2024.2.1升级错误

提示 Gradle 版本不兼容,升级后就报错了 。 1.gradle安装包镜像 //distributionUrlhttps\://services.gradle.org/distributions/gradle-8.5-bin.zip distributionUrlhttps://mirrors.cloud.tencent.com/gradle/gradle-8.5-bin.zip //镜像 2. Build报错&#xff1a…

基于 Seq2Seq 的中英文翻译项目(pytorch)

项目简介 本项目旨在使用 PyTorch 构建一个基于 Seq2Seq(编码器-解码器架构)的中英文翻译模型。我们将使用双语句子对的数据进行训练,最终实现一个能够将英文句子翻译为中文的模型。项目的主要步骤包括: 数据预处理:…

[ESP32]ESP-IDF使用组件添加U8g2图形库

U8g2 在ESP32使用u8g2的时候可以使用添加component的方式进行, 由于官方的component库没有, 这里我找到了一个可以使用的github库, 使用git的方式进行添加这一个库 具体的原理可以看[官方手册](https://docs.espressif.com/projects/esp-idf/zh_CN/stable/esp32/api-guides/to…

记HttpURLConnection下载图片

目录 一、示例代码1 二、示例代码2 一、示例代码1 import java.io.*; import java.net.HttpURLConnection; import java.net.URL;public class Test {/*** 下载图片*/public void getNetImg() {InputStream inStream null;FileOutputStream fOutStream null;try {// URL 统…

如何使用ssm实现基于Java的民宿预订管理系统的设计与实现

TOC ssm773基于Java的民宿预订管理系统的设计与实现jsp 绪论 1.1课题研究背景意义 随着科技的发展,计算机的应用,人们的生活方方面面都和互联网密不可分。计算机的普及使得人们的生活更加方便快捷,网络也遍及到我们生活的每个角落&#x…

面试题:Redis(一)

1. redis是单线程还是多线程? 2. IO多路复用听说过么? 3. Redis为什么快? 1. Redis是单线程还是多线程? 版本不同,Redis基于的架构也不同,所以单单问是单还是多线程并不严谨 3.x 之前 redis都是单线程 4.x …

Linux文件属性

Linux 文件基本属性 为了保护系统的安全性,Linux 系统对不同的用户访问同一文件(包括目录文件)的权限做了不同的规定。 在 Linux 中我们通常使用以下两个命令来修改文件或目录的所属用户与权限: - chown (change owner) &#…

算法打卡:第十一章 图论part11

今日收获:Floyd 算法,A * 算法,最短路算法总结 1. Floyd 算法 题目链接:97. 小明逛公园 思路:Floyd用于解决多源最短路问题,对边的正负权值没有要求。核心是动态规划 (1)dp数组的…