SpringBoot的自动装配

我们今天再来说一下关于 SpringBoot 的自动装配,为什么会有这样的问题呢?一般这种情况都是在面试的过程中,面试官有时候会问到这个问题,就比如从开始问SpringBoot 的一些常用注解,到SpringBoot的一些特性,然后引申到这个 SpringBoot 的自动装配上来。今天就和了不起一起来聊聊关于这个 SpringBoot 的自动装配吧。

什么是SpringBoot的装配

Spring Boot 的自动装配(Auto-Configuration)是指 Spring Boot 会根据项目中添加的依赖和其他因素,自动配置你的 Spring 应用程序。这一特性使得开发者在创建 Spring 应用程序时,可以省去大量的手动配置工作,从而快速启动和运行应用程序。

自动装配流程

SpringBoot的自动装配工作流程主要基于其核心注解和一系列的配置机制,以下是对其工作流程的详细解析:

1. 启动注解:

  • SpringBoot的自动装配始于@SpringBootApplication注解。这个注解实际上是@SpringBootConfiguration、@EnableAutoConfiguration和@ComponentScan三个注解的组合。

2,@SpringBootConfiguration:

  • @SpringBootConfiguration注解本质上是一个@Configuration注解的包装,用于声明当前类是一个配置类,可以定义Bean,也可以引入其他配置类。3.@EnableAutoConfiguration:

  • 这是实现自动装配的关键注解。它包含了@AutoConfigurationPackage和@Import(AutoConfigurationImportSelector.class)两个子注解。

  • @AutoConfigurationPackage:用于自动配置包,使得主配置类(带有@SpringBootApplication注解的类)所在的包及其子包中的组件都能被Spring容器扫描到。

  • @Import(AutoConfigurationImportSelector.class):这个注解的作用是导入类,但在这里它并不是直接导入一个普通的类,而是导入了一个实现了ImportSelector接口的类AutoConfigurationImportSelector。这个类的作用是根据一定的规则(比如类路径下的META-INF/spring.factories文件)来加载并配置一些自动装配的类。

4.META-INF/spring.factories:

  • 在Spring Boot的自动装配过程中,META-INF/spring.factories文件起到了非常关键的作用。这个文件是Spring Boot用来加载自动配置类的一个约定俗成的文件,它位于各个Spring Boot Starter的jar包中。Spring Boot在启动时,会扫描所有jar包中的META-INF/spring.factories文件,并将其中配置的自动配置类加载到Spring容器中。

5.自动配置类:

  • 这些类通常是以AutoConfiguration结尾的,它们使用@Configuration注解标注,并且内部定义了一些Bean。这些Bean就是Spring Boot自动装配到Spring容器中的组件。

6.条件装配:

  • 在自动配置类中,经常可以看到@ConditionalOnClass、@ConditionalOnProperty等条件注解。这些注解的作用是判断当前环境是否满足某个条件,如果满足则进行自动装配,否则不进行装配。这样可以根据项目的实际情况来灵活地选择需要装配的组件。

7.总结:

SpringBoot的自动装配工作流程大致可以归纳为:首先通过@SpringBootApplication注解启动Spring Boot应用,然后利用@EnableAutoConfiguration注解中的@Import(AutoConfigurationImportSelector.class)来加载META-INF/spring.factories文件中配置的自动配置类,最后根据这些自动配置类中的定义和条件注解来将相应的组件装配到Spring容器中。

自动装配的核心

@SpringBootApplication

这个注解,就是自动装配的核心,我们来详细解读一下这个 @SpringBootApplication

它其实是一个组合注解,用于简化 Spring Boot 应用的配置。这个注解通常被用在 Spring Boot 的主类上,以指示该类是一个特殊的配置类,用于引导应用上下文的启动。

组成部分

1.@SpringBootConfiguration:

  • 这是一个特殊的 @Configuration 注解,表示该类是一个配置类,并告诉 Spring Boot 这是一个特殊的配置类,用于加载应用的上下文设置。

  • 实际上,@SpringBootConfiguration 仅仅是 @Configuration 的一个特殊版本,并且二者在功能上没有区别。但 @SpringBootConfiguration 更多地用于标识这是一个 Spring Boot 应用。

2.@EnableAutoConfiguration:

  • 这是 Spring Boot 的核心特性之一。它告诉 Spring Boot 根据添加的 jar 依赖项、类路径设置、各种属性设置等自动配置你的 Spring 应用。例如,如果你的类路径下有 spring-boot-starter-web,那么 Spring Boot 会自动配置嵌入式 Tomcat 服务器和 Spring MVC。

  • 你可以通过 spring.autoconfigure.exclude 属性来排除某些自动配置。

3.@ComponentScan:

  • @ComponentScan 告诉 Spring 扫描当前包及其子包下的组件(如 @Component、@Service、@Repository、@Controller 等),并将它们注册为 Spring Bean。

  • 默认情况下,它会扫描标注了 @SpringBootApplication 注解的类所在的包及其子包。你可以通过 basePackages 或 basePackageClasses 属性来指定扫描的包。

如果这个时候,我们给面试官解释了这个 SpringBoot的自动装配的原理之后,面试官很大程度上就开始要往下延伸内容了,既然 @Autowired 能实现了则个自动装配,那么还有其他注解么?以及他和 @Autowired 的区别在哪呢?

@Resource和@Autowire

@Resource 和 @Autowired 都是 Spring 框架中用于自动装配 bean 的注解,但它们之间有一些区别。以下是这两个注解的主要区别:

来源不同

@Autowired 是 Spring 特有的注解,用于自动装配 bean。

@Resource 是 Java 的标准注解,属于 JSR-250 规范的一部分,但 Spring 也支持它作为自动装配的注解。

@Autowired

@Autowired 是 Spring 特有的注解,用于自动装配 bean。Spring 容器会检查 bean 的属性、方法以及构造器,然后使用与指定类型相匹配的 bean 进行自动装配。

  • 类型匹配:默认情况下,@Autowired 是基于类型(Type)的自动装配。如果存在多个相同类型的 bean,那么就需要使用其他机制(如 @Qualifier 注解或 @Primary 注解)来进一步指定。

  • 构造器注入:Spring 4.3 之后,推荐使用构造器注入来替代字段注入,因为它可以提供更好的不可变性和测试性。

  • 可配置性:@Autowired 是可选的,并且可以通过 Spring 的配置文件(如 XML 文件)进行更详细的配置。

@Resource

@Resource 是 Java EE 的一部分(来自 JSR-250),同时也是 Spring 支持的注解。它提供了更丰富的功能,包括指定名称(name)和类型(type)来查找 bean。

  • 名称和类型匹配:与 @Autowired 相比,@Resource 提供了更灵活的匹配方式。它可以基于名称(如果提供了)或类型进行查找。如果同时指定了名称和类型,并且找不到匹配的 bean,那么就会抛出异常。

  • 与 Java EE 兼容:由于 @Resource 是 Java EE 的一部分,因此它可以在任何支持 Java EE 的环境中使用,而不仅仅是 Spring。

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

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

相关文章

zynq之UART

之前尝试UART0(MIO50、51),串口调试助手收到发送的内容。 现在板子上EMIO端有多个串口,所以看看这个怎么弄。 串口是484的转接板(接232的串口就会输出乱码) https://blog.51cto.com/u_15262460/2882973 …

【九十三】【算法分析与设计】719. 找出第 K 小的数对距离,N 台电脑的最长时间,二分答案法

719. 找出第 K 小的数对距离 - 力扣&#xff08;LeetCode&#xff09; 数对 (a,b) 由整数 a 和 b 组成&#xff0c;其数对距离定义为 a 和 b 的绝对差值。 给你一个整数数组 nums 和一个整数 k &#xff0c;数对由 nums[i] 和 nums[j] 组成且满足 0 < i < j < nums.le…

java调用远程接口下载文件

在postman中这样下载文件 有时下载文件太大postman会闪退&#xff0c;可以通过代码下载&#xff0c;使用hutool的http包

3步操作助您轻松实现苹果手机照片一键传输至电脑

对于很多使用苹果手机的用户来说&#xff0c;随着手机中照片和视频数量的不断积累&#xff0c;如何将这些珍贵的回忆从手机转移到电脑&#xff0c;以便更好地保存、整理和分享&#xff0c;成为了一个值得关注的问题。那么&#xff0c;苹果手机怎么把照片导入电脑呢&#xff1f;…

鸿蒙课程培训 | 讯方技术与鸿蒙生态服务公司签约,成为鸿蒙钻石服务商

3月15日&#xff0c;深圳市讯方技术股份有限公司与鸿蒙生态服务公司签署合作协议&#xff0c;讯方技术成为鸿蒙钻石服务商&#xff0c;正式进军鸿蒙原生应用培训开发领域。讯方技术总裁刘国锋、副总经理刘铭皓、深圳区域总经理张松柏、深圳区域交付总监张梁出席签约仪式。 作…

乡村振兴的乡村产业创新发展:培育乡村新兴产业,打造乡村产业新名片,促进乡村经济多元化发展

目录 一、引言 二、乡村产业创新发展的必要性 &#xff08;一&#xff09;适应新时代发展要求 &#xff08;二&#xff09;满足消费升级需求 &#xff08;三&#xff09;促进农民增收致富 三、培育乡村新兴产业策略 &#xff08;一&#xff09;加强科技创新引领 &#…

在 MFC 中 UNICODE 加 _T 与 L 长字符串,有什么区别?

在MFC&#xff08;Microsoft Foundation Classes&#xff09;和更广泛的Windows编程环境中&#xff0c;UNICODE宏用于指示程序应使用Unicode字符集&#xff08;通常是UTF-16&#xff09;来处理文本。当定义了UNICODE宏时&#xff0c;编译器和库函数会期待和处理宽字符&#xff…

Android下HWC以及drm_hwcomposer普法((上)

Android下HWC以及drm_hwcomposer普法((上) 引言 按摩得全套&#xff0c;错了&#xff0c;做事情得全套&#xff0c;普法分析也是如此。drm_hwcomposer如果对Android图形栈有一定研究的童鞋们应该知道它是Android提供的一个的图形后端合成处理HAL模块的实现。但是在分析这个之前…

Java复习-集合篇

集合 集合分为俩大类 单列集合 每个元素数据只包含一个值 双列集合 每个元素包含俩个键值对 Conllection单列集合 单列集合常用的主要是下列几种 List集合 List系列集合的特点&#xff1a;添加元素是有序、可重复、有索引 这里我们来试一下ArrayList ArrayList<String&g…

Spring OAuth2:开发者的安全盾牌!(上)

何利用Spring OAuth2构建坚不可摧的安全体系&#xff1f;如何使用 OAuth2 从跨域挑战到性能优化&#xff0c;每一个环节都为你的应用保驾护航&#xff1f; 文章目录 Spring OAuth2 详解1. 引言简述OAuth2协议的重要性Spring Framework对OAuth2的支持概述 2. 背景介绍2.1 OAuth2…

比较Rust和Haskel

在比较Rust和Haskell时&#xff0c;我们可以从多个维度来分析它们各自的优势。以下是Rust相对于Haskell的优势&#xff0c;以及Haskell相对于Rust的优势&#xff1a; Rust比Haskell强的方面&#xff1a; 内存安全与并发性&#xff1a; Rust通过独特的所有权系统和借用检查器在…

智能仓储物流系统(WMS)系列-管理查询调整

好的应用系统应是细分简单&#xff0c;界面简洁易操作&#xff0c;程序代码简洁易懂的。

史上最全排序算法整理(2)

本篇文章我们将接着上篇继续介绍常见的排序算法&#xff0c;有需要的小伙伴可以移步史上最全排序算法整理&#xff08;1&#xff09;查看相关内容哦 1.冒泡排序 1.1基本思想 在待排序的一组数中&#xff0c;将相邻的两个数进行比较&#xff0c;若前面的数比后面的数大就交换两…

【解决npm install -g windows-build-tools的安装问题】

解决npm install -g windows-build-tools的安装问题 https://developer.huawei.com/consumer/cn/forum/topic/0203740461436730610?fid26

gitlab 创建 ssh 和 token

文章目录 一、创建ssh key二、将密钥内容复制到gitlab三、创建token 一、创建ssh key 打开控制台cmd&#xff0c;执行命令 ssh-keygen -t rsa -C xxxxx xxxxx是你自己的邮箱 C:\Users\xx\.ssh 目录下会创建一个名为id_rsa.pub的文件&#xff0c;用记事本打开&#xff0c;并…

基于深度学习的中文情感分析系统python flask

基于python的毕业设计 基于深度学习的中文情感分析系统(flask)(源码说明文档演示) 毕业设计课程设计期末大作业、课程设计、高分必看&#xff0c;下载下来&#xff0c;简单部署&#xff0c;就可以使用。 包含&#xff1a;项目源码、数据库脚本、软件工具等&#xff0c;该项目…

【Spring Cloud】微服务工程中的服务注册与发现配置中心-Consul

Catalog Spring Cloud Consul一、需求二、是什么三、优点四、缺点五、怎么用六、细节 Spring Cloud Consul 一、需求 多个微服务之间通过RestTemplate中的api相互调用&#xff0c;一般要写死微服务的IP地址和端口号&#xff0c;相当于硬编码&#xff0c;非常不灵活&#xff0…

MyBatis出现:SQLSyntaxErrorException: Unknown column ‘XXX‘ in ‘field list‘

<update id"updateStudent">update tb_students set stu_name${stuName},stu_gender${stuGender},stu_age${stuAge},stu_tel${stuTel}where stu_num ${stuNum}</update> 本质上来说&#xff0c;是Mybatis使用上的错误&#xff0c;不熟悉&#xff0c;理…

C#知识|通过ADO.NET实现应用程序对数据库的增、删、改操作。

哈喽,你好啊,我是雷工! 前边学习了SQLServer数据库相关的增删改查的基本操作, 上节练习了C#通过ADO.NET技术和SQLServer数据库建立连接和断开连接的写法, 本节继续学习ADO.NET的相关操作,下面为向数据库中插入数据的相关练习笔记。 01 向数据库插入数据 插入数据的过程…

SQL函数--union all 使用方法及案例

1. 使用方法 在 SQL 中&#xff0c;UNION ALL 操作用于结合两个或更多 SELECT 语句的结果集&#xff0c;包括所有匹配的行&#xff0c;甚至包括重复的行。这与 UNION 不同&#xff0c;因为 UNION 会自动删除重复的行。 满足条件&#xff1a; 1、两个select查询的列的数量必须相…