SpringBoot的自动装配原理

一、@SpringBootConfiguration注解的作用

                @SpringBootApplication注解是SpringBoot项目的核心注解,加在启动引导类上。点击进去可以发现@SpringBootApplication注解是一个组合注解。其中@SpringBootConfiguration@EnableAutoConfiguration是由Spring提供的,剩下的注解是由JDK提供的。对于SpringBoot项目,我们重点分析@SpringBootConfiguration和@EnableAutoConfiguration注解

1.1、@SpringBootConfiguration表示启动引导类是一个配置类

        点击@SpringBootConfiguration注解进去可以发现@SpringBootConfiguration注解也是一个组合注解,并且继承了@Configuration注解,说明@SpringBootApplication注解间接继承了

@Configuration注解。

        @Configuration注解又加在了启动引导类上面,说明启动引导类是一个配置类,配置类中加了@Bean注解的方法的返回值会放入Spring的容器中。

代码演示:

启动引导类中添加@Bean注解的方法

package com.itboy;

import com.itboy.Import.MyImportSeletor;
import com.itboy.pojo.User;
import org.example.config.BrandAutoConfiguration;
import org.example.config.UserAutoConfiguration;
import org.example.pojo.Brand;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Import;

/**
 * 
 */
@SpringBootApplication

public class SpringBootPlusApplication {
    public static void main(String[] args) {
        ConfigurableApplicationContext app = SpringApplication.run(SpringBootPlusApplication.class, args);

        User user = app.getBean(User.class);
        System.out.println("user = " + user);
        
    }

    @Bean
    public User testUser(){
        return new User();
    }

}

        运动程序,发现可以从容器中获得User对象,说明添加了@Bean注解的方法的返回值放到了Spring容器中。

所以@SpringBootConfiguration注解的第一个作用就是将启动引导类变成配置类

1.2、 @SpringBootConfiguration可以让测试类能够找到启动引导类

        注释掉启动引导类上面的@SpringBootApplication注解,然后启动@SpringBootTest测试类中的测试方法,会发现报错。

Unable to find a @SpringBootConfiguration 

说明 @SpringBootTest测试类中的测试方法会去找@SpringBootConfiguration注解。

此时需要手动指定启动引导类才能解决报错问题

 

1.3、总结 

 @SpringBootConfiguration注解的作用有:

1、表示启动引导类是一个配置类,因为相当于@SpringBootApplication注解间接继承了@Configuration注解。

2、 让测试类能够找到启动引导类,具体的看1.2中的内容。

二、@Import注解的作用 

 通过@Import注解中的导入器我们可以指定配置类。

我们在pom.xml配置文件中添加创建的模块

创建的模块结构如下图:

 

创建的模块中存在两个配置类UserAutoConfigurationBrandAutoConfiguration 

                                  

 

 

创建的模块和我们主模块之间的位置关系:

 

        所以创建的模块肯定不在spring_boot项目启动引导类的包及其子包中。 所以在spring_boot项目的容器对象中肯定不能获取到创建的模块中的User和brand对象。

        但是在启动引导类上添加@Import注解就能获取到User和brand对象。

        通过@Import注解中的导入器能指定配置类有哪些,@Import注解中的值相当于导入器,这里的MyImportSeletor.class是我自定义的导入器

 

        导入器需要实现ImportSelector接口,并重写selectImports方法,返回值为字符串数组,里面的值为配置类的全限定名,通过返回值就能确定配置类有哪些

        再找到配置类中加了@Bean注解的方法,方法的返回值就会放入spring的容器中。就完成了自动装配的工程。

总结

1、@Import注解可以通过导入器指定配置类。

2、@Import注解中的值是导入器,通过导入器我们可以指定配置类。

3、配置类中加了@Bean注解的方法的返回值就会放到spring容器中,从而实现自动装配。

三、@EnableAutoConfiguration注解的作用 

        @EnableAutoConfiguration注解是组合注解,继承了@Import注解。

        

        通过二中分析我们知道可以通过@Import注解中的导入器找到配置类,这里的AutoConfigurationImportSelector.class就是SpringBoot定义的导入器,所以继续点击导入器。

        发现AutoConfigurationImportSelector.class导入器中存在selectImports方法,并且方法返回值为字符串数组,与二中刚才的分析保持一致,所以这个selectImports方法就是指定配置类

 

        if的条件判断是返回没有导入的情况,所以else里面的逻辑才是指定配置类。 

        接着点击selectImports方法中的getAutoConfigurationEntry方法,再点击getAutoConfigurationEntry方法中的getCandidateConfigurations方法        

        

        接着点击 getCandidateConfigurations方法中的loadFactoryNames方法

    

 

         接着点击loadFactoryNames方法中的loadSpringFactories方法

        最后发现读取的是META-INF文件夹里面的spring.factorie文件 

 

总结:

1、 @EnableAutoConfiguration注解的作用是完成SpringBoot项目的自动装配。

2、会去读取META-INF文件夹里面的spring.factorie文件。

3、spring.factorie文件中定义了指定的配置类,找到配置类,并把配置类中加了@Bean注解的方法的返回值放入Spring容器就完成了自动装配。

四、自动装配的条件选择

4.1、SpringBoot自带的Starter和第三方Starter

        SpringBoot提供的Starter是以spring-boot-starter开头的,例如spring-boot-starter-webspring-boot-starter-test

                

        第三方提供的starter一般是以spring-boot-starter为结尾的。例如:mybatis-spring-boot-starter

       

 

4.2、通过在External Libraries中找到对应的jar包

        可以发现第三方Starter都会有 META-INF文件夹,并且META-INF文件夹里面肯定也会有spring.factorie文件。下面是mybatisspring.factorie文件里面的内容。

        

org.springframework.boot.autoconfigure.EnableAutoConfiguration是key值,固定的写法。

里面的value值定义了配置类,mybatis定义的配置类有:

MybatisLanguageDriverAutoConfiguration

MybatisAutoConfiguration

MybatisDependsOnDatabaseInitializationDetector

 4.3、ConditionalOn.....注解决定了哪些方法返回值放入Spring容器中

        打开4.2中找到的MybatisLanguageDriverAutoConfiguration配置类。

        可以发现 MybatisLanguageDriverAutoConfiguration类肯定被@Configuration注解定义了,那是不是这个类所有加了@Bean注解的方法的返回值都会放入Spring容器中完成自动装配呢?

         可以发现MybatisLanguageDriverAutoConfiguration类中的很多方法上面加了类似@ConditionalOnClass、@ConditionalOnMissingBean等注解,都是限制条件,所以并不是所有的加了@Bean注解的方法的返回值都会放入Spring容器中。

 

 

  总结:

1、 指定的配置类中并不是所有的加了@Bean注解的方法的返回值都会放入Spring容器中。

2、 @ConditionalOnClass、@ConditionalOnMissingBean等注解,都是限制条件。

 

五、自动装配原理总结

        通过@EnableAutoConfiguration注解,会去找到第三方jar包中META-INF文件夹里面的spring.factorie文件。

        spring.factorie文件里面指定了配置类,再找到配置类中加了@Bean注解的方法,再找到能通过@ConditionalOnClass、@ConditionalOnMissingBean等注解的限制条件后,就会将方法返回值放入Spring的容器中。

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

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

相关文章

牛客BC52 判断整数奇偶性(C语言)

#include <stdio.h> int main() {int a;while ((scanf("%d", &a)) ! EOF){ if (a%20)printf("Even\n");elseprintf("Odd\n");}return 0; }

跨平台Recorder录音插件:支持多种格式、音频可视化、实时上传、语音识别

视频教程地址&#xff1a;【跨平台Recorder录音插件&#xff1a;支持多种格式、音频可视化、实时上传、语音识别】 https://www.bilibili.com/video/BV1jQ4y1c7e4/?share_sourcecopy_web&vd_sourcee66c0e33402a09ca7ae1f0ed3d5ecf7c /** 先引入Recorder &#xff08; 需先…

Programming Abstractions in C阅读笔记:p254-p257

《Programming Abstractions in C》学习第70天&#xff0c;p254-p257总结&#xff0c;总计4页。 一、技术总结 1.minimax strategy(极小化极大算法) p255, This idea–finding the position that leaves your opponent with the worst possible best move–is called the mi…

MiniTab的单值的变量控制图——I-MR 控制图分析

单值的变量控制图分为&#xff1a;I-MR 控制图、Z-MR 控制图、单值控制图、移动极差控制图4种。 I-MR 控制图 功能菜单请选择&#xff1a;统计>控制图>单值的变量控制图>I-MR。 使用 I-MR 控制图 可以在拥有连续数据且这些数据是不属于子组的单个观测值的情况下监视…

Supervised Contrastive 损失函数详解

有什么不对的及时指出&#xff0c;共同学习进步。(●’◡’●) 有监督对比学习将自监督批量对比方法扩展到完全监督设置&#xff0c;能够有效地利用标签信息。属于同一类的点簇在嵌入空间中被拉到一起&#xff0c;同时将来自不同类的样本簇推开。这种损失显示出对自然损坏很稳…

专业远程控制软件有哪些品牌

远程办公、远程控制类的软件很多&#xff0c;主打方向和面向的客户人群也不一样。个人用户可能更在意便捷、免费等因素&#xff1b;专业用户会更注重安全性、管理功能等。今天我们介绍几个在全球知名的专业商业远程软件。 1、TeamViewer 简介&#xff1a;TeamViewer &#xf…

EXCEL VBA调用adobe的api识别电子PDF发票里内容并登记台账

EXCEL VBA调用adobe的api识别电子PDF发票里内容并登记台账 代码如下 使用须知&#xff1a; 1、工具--引用里勾选[Adobe Acrobat 10.0 Type Library] 2、安装Adobe Acrobat pro软件Dim sht As Worksheet Function BrowseFolders() As String 浏览目录Dim objshell As ObjectDim…

暗藏危险,警惕钓鱼邮件!

叮 您有一份福利待查收 您的信息资产需要排查 您的账户异常需要验证 这些看似“重要”的邮件 都藏着攻击者的恶意嘴脸 随着网络安全防护和建设的重要性日益凸显&#xff0c;国家安全、企业安全、合规需求及业务驱动等各个方面都亟需将网络安全作为基石。在企业业务转型发展…

【C++中STL】stack和queue容器

stack和queue stack基本概念常用接口 quque基本概念常用接口 stack 基本概念 stack是一种先进后出的数据结构&#xff0c;它只有一个出口 栈中只有顶端的元素可以被外界使用&#xff0c;因此栈不允许由遍历行为 可以判断是否为空empty(),和统计个数size(); 常用接口 1、st…

服务器是什么?(四种服务器类型)

服务器 服务器定义广义: 专门给其他机器提供服务的计算机。狭义:一台高性能的计算机&#xff0c;通过网络提供外部计算机一些业务服务 个人PC内存大概8G&#xff0c;服务器内存128G起步 服务器是什么 服务器指的是 网络中能对其他机器提供某些服务的计算机系统 &#xff0c;相对…

用Yara对红队工具“打标”

前言: YARA 通常是帮助恶意软件研究人员识别和分类恶意软件样本的工具&#xff0c;它基于文本或二进制模式创建恶意样本的描述规则&#xff0c;每个规则由一组字符串和一个布尔表达式组成&#xff0c;这些表达式决定了它的逻辑。 但是这次我们尝试使用 YARA 作为一种扫描工具…

【好书推荐-第五期】《互联网大厂推荐算法实战》(异步图书出品)

&#x1f60e; 作者介绍&#xff1a;我是程序员洲洲&#xff0c;一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主、前后端开发、人工智能研究生。公粽号&#xff1a;程序员洲洲。 &#x1f388; 本文专栏&#xff1a;本文…

机器学习 | 深入探索Numpy的高性能计算能力

目录 初识numpy numpy基本操作 数组的基本操作 ndarray运算 数组间运算 矩阵 初识numpy Numpy&#xff08;Numerical Python&#xff09;是一个开源的Python科学计算库&#xff0c;用于快速处理任意维度的数组。Numpy支持常见的数组和矩阵操作。对于同样的数值计算任务&…

k8s 进阶实战笔记 | Pod 创建过程详解

Pod 创建过程详解 ​ 初始状态0 controller-manager、scheduler、kubelet组件通过 list-watch 机制与 api-server 通信并检查资源变化 第一步 用户通过 CLI 或者 WEB 端等方式向 api-server 发送创建资源的请求&#xff08;比如&#xff1a;我要创建一个replicaset资源&…

Hadoop3.x源码解析

文章目录 一、RPC通信原理解析1、概要2、代码demo 二、NameNode启动源码解析1、概述2、启动9870端口服务3、加载镜像文件和编辑日志4、初始化NN的RPC服务端5、NN启动资源检查6、NN对心跳超时判断7、安全模式 三、DataNode启动源码解析1、概述2、初始化DataXceiverServer3、初始…

聚道云软件连接器:打通金蝶云星空与招商银行CBS,提升企业财务和银行业务效率

【客户介绍】 某企业是一家从事电子商务的企业&#xff0c;随着业务的不断扩大&#xff0c;对于财务管理和银行业务的需求也越来越高。该企业希望能够实现财务和银行业务的自动化处理&#xff0c;提高工作效率。由于业务的不断发展&#xff0c;企业面临着越来越多的资金管理挑…

零基础学习数学建模——(四)备战美赛

本篇博客将讲解如何备战美赛。 什么是美赛 美赛&#xff0c;全称是美国大学生数学建模竞赛&#xff08;MCM/ICM&#xff09;&#xff0c;由美国数学及其应用联合会主办&#xff0c;是最高的国际性数学建模竞赛&#xff0c;也是世界范围内最具影响力的数学建模竞赛。 赛题内容…

Oracle触发器简单应用示例(销售与库存)

目录 一、应用描述 1、应用场景&#xff1a; 2、具体场景&#xff1a; 二、表结构介绍 1、表名介绍&#xff1a; 2、表结构&#xff1a; 三、设置触发器 四、运行示例 1、初始库存描述 2、有库存情况 2.1 1001号产品售出1件 2.2 1001号产品库存已减1 3、无库存情况…

外汇天眼:QoinTech误信假老师话术投资外汇,惨遭黑平台滑点爆仓拒出金

去年11月与12月&#xff0c;外汇天眼先后发布了「钓鱼广告诱加投资群组&#xff0c;限制出金逼迫缴分成费」与「假投顾诱导投资黄金获利&#xff0c;黑平台操作爆仓狠诈700万」这2篇文章&#xff0c;曝光黑平台QoinTech的诈骗手法&#xff0c;呼吁投资人不要上当&#xff0c;没…

[SwiftUI]修改状态栏文字颜色

问题&#xff1a; 如图&#xff0c;在项目 Info.plist 中&#xff0c;将 UIViewControllerBasedStatusBarAppearance 设置为 NO&#xff0c;将UIStatusBarStyle设置为Light Content后&#xff0c;APP的状态栏字体颜色仍然是黑色没变成白色。 修复&#xff1a; https://stacko…