SpringBoot2:配置绑定与自动配置功能源码解读

一、配置绑定

1、作用说明

我们在开发springboot项目时,会有个配置文件,application.properties文件。
我们知道,像什么访问端口、上传功能的相关配置,都会在这里进行配置。
而这些,都是springboot自带的或者第三方jar包的属性。

那么,我们怎么给自己定义的Bean属性配置属性值了?
这里,就用到配置绑定功能。

2、实现方式

2.1、@Component + @ConfigurationProperties方式(推荐使用)

自定义bean

@ToString
@Data
@Component
@ConfigurationProperties(prefix = "mycar")
public class Car {private String brand;private Integer price;}

application.properties文件中

mycar.brand=YD
mycar.price=100000

controller类中

    @AutowiredCar car;@RequestMapping("/car")public Car car(){return car;}

注意,使用@ConfigurationProperties注解,IDEA可能会报提示
在这里插入图片描述
解决办法:
File | Settings | Languages & Frameworks | Spring | Spring Boot
在这里插入图片描述

2.2、@EnableConfigurationProperties + @ConfigurationProperties方式

使用说明:
这种方式,需要再配置类上使用@EnableConfigurationProperties注解,然后,在自定义bean上使用@ConfigurationProperties注解

配置类:
在这里插入图片描述
bean
在这里插入图片描述

二、自动配置功能源码解读

我们启动springboot项目的时候,就自动注册到IOC容器中很多的组件。
那么,这是如何实现的?
多少组件被注册?这些信息写在那个配置文件中了?组件的自定义配置怎么关联上的?
带着这些问题,我们来学习一下springboot的自动配置功能源码。

1、从启动类开始

@SpringBootApplication这个注解等价于下面三个注解@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan("com.atguigu.boot")

1.1、@SpringBootConfiguration

这个注解被@Configuration标注,所以,它是个配置类。
没什么内容。
和注册组件没关系。
在这里插入图片描述

1.2、@ComponentScan

这个注解,我们都知道,是扫描包的路径。
一般是针对于我们开发人员,在该路径下,加了注解的类,会被注册到容器中。
所以,和springboot的内部组件注册无关。

1.3、@EnableAutoConfiguration

这个注解,实际上是负责springboot的自动配置功能的。
它等价于下面两个注解:

@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
1.3.1、@AutoConfigurationPackage

这个注解的作用是获取启动类的包路径,然后,进行用户组件扫描并注册。
在这里插入图片描述在这里插入图片描述
我们在124行打上断点。
会发现,获取了启动类的包路径
这就是,为什么我们的springboot默认扫描路径是启动类所在路径及其子路径。
在这里插入图片描述

1.3.2、@Import(AutoConfigurationImportSelector.class)

可以发现,这里的@Import注解,将spring-boot-autoconfigure-2.3.4.RELEASE.jar包里面的一个类,注册到IOC容器中。
在这里插入图片描述
我们,进入这个类中
找到selectImports方法
在这里插入图片描述
进入getAutoConfigurationEntry方法
在这里插入图片描述
进入getCandidateConfigurations方法
代码:

List<String> configurations = SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(),getBeanClassLoader());

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

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

相关文章

Linux | 匿名管道和命名管道:进程间通信数据流的桥梁

目录 1、进程间通信目的 2、管道——匿名管道和命名管道 匿名管道 匿名管道的示例代码&#xff1a;将数据写入管道、子进程从管道读取数据并将其输出到bash中 父子进程通过匿名管道建立通信 重点&#xff1a;管道的五个特点 命名管道&#xff08;也称为FIFO&#xff09;…

每日一题,零基础入门FPGA——工程师在线精讲,直播预告

题目传送门&#xff1a;F学社 zzfpga.com/StudentPlatform/Sheet/QuestionBankhttp://zzfpga.com/StudentPlatform/Sheet/QuestionBank 【第Ⅰ期题目 * 5】 请使用D触发器和必要的逻辑门实现此同步时序电路&#xff0c;用Verilog语言描述。 【第Ⅰ期题目 * 4】 请设计一个0…

观测云核心技术揭秘:基于时间的半结构化数据模型

前言 众所周知&#xff0c;真正意义上的统一监控观测平台本质上是一个超大的数据湖&#xff0c;其存储了大量的来自监控指标&#xff0c;各种各样的日志&#xff0c;各种各样的链路追踪以及包括用户访问行为等海量的可观测性数据。 这些海量数据有什么特点呢&#xff1f; 首先…

【网络安全】逻辑漏洞:绕过应用程序重要功能

未经许可,不得转载。 文章目录 正文漏洞影响正文 目标:xxx.com 一个流行的汽车平台,允许用户为经销商留下评论。该平台有一个功能,用户可以点赞评论,并且它限制每个用户对每个评论只能点赞一次。 然而,我找到了绕过的方法(并不是并发)。 在点击“点赞”按钮时拦截请…

新手指南 | 研发人员奖金激励方案步骤实操

研发团队是一个非常独特的存在。在研发人员的薪酬、激励方案设计上也是很多HR的痛点。 毕竟工作变化大&#xff0c;职责变化快、个体能力差异大、投入了不一定会有产出、多线程并行&#xff0c;贡献难判定、知识密度高&#xff0c;价值难衡量等等... 基于以上难点&#xff0c…

【系统架构设计】嵌入式系统设计(1)

【系统架构设计】嵌入式系统设计&#xff08;1&#xff09; 嵌入式系统概论嵌入式系统的组成硬件嵌入式处理器总线存储器I/O 设备与接口 软件 嵌入式开发平台与调试环境交叉平台开发环境交叉编译环境调试 嵌入式系统概论 嵌入性、专用性、计算机系统是嵌入式系统的三个基本的核…

0基础轻松玩转.NET Web API 8.0【CICD】项目实战

1.背景 最近在学习CI/CD&#xff0c;为了加快熟悉CI/CD&#xff0c;我实操了下基于.Net 8.0的CI/CD项目实战。Ci/CD就是自动化作业&#xff0c;实现项目自动编译、发布、执行等&#xff0c;也有用于拉取推送数据的场景。本文主要介绍了在win 11下搭建CI/CD&#xff0c;实现自动…

UEFI——PCD的简单使用

一、PCD的定义及概念 在UEFI固件接口中&#xff0c;PCD&#xff08;Platform Configuration Database&#xff09;是一个用于存储和访问平台特定配置信息的机制。PCD允许UEFI驱动程序和应用程序在运行时获取和设置平台相关的参数&#xff0c;而无需硬编码这些值。PCD变量可以被…

加速电商物流效率:推荐几款实用的快递批量查询工具

做电商必不可少的快递批量查询平台分享&#xff1a;固乔快递查询助手使用全攻略 在电商行业日益竞争的今天&#xff0c;高效管理物流信息成为了商家们不可或缺的一环。面对每天成百上千的订单和快递单号&#xff0c;如何快速、准确地查询并跟踪物流状态&#xff0c;成为了电商…

mysql高可用之组复制

MySQL Group Replication( 简称 MGR ) 是 MySQL 官方于 2016 年 12 月推出的一个全新的高可用与高扩展的解决方案组复制是 MySQL 5.7.17 版本出现的新特性&#xff0c;它提供了高可用、高扩展、高可靠的 MySQL 集群服务MySQL 组复制分单主模式和多主模式&#xff0c;传统的…

请解释Java中的装箱拆箱操作对性能的影响,并讨论其最佳实践。什么是Java中的值传递和引用传递?它们在函数调用中的表现有何不同?

请解释Java中的装箱拆箱操作对性能的影响&#xff0c;并讨论其最佳实践。 在Java中&#xff0c;装箱&#xff08;Boxing&#xff09;和拆箱&#xff08;Unboxing&#xff09;操作是Java自动类型转换机制的一部分&#xff0c;主要用于基本数据类型&#xff08;如int, double, c…

stun和trun

在 WebRTC 中&#xff0c;STUN&#xff08;Session Traversal Utilities for NAT&#xff09;和 TURN&#xff08;Traversal Using Relays around NAT&#xff09;是用于NAT穿透的两种不同的技术&#xff0c;它们解决的问题不同&#xff0c;因此在某些情况下需要同时使用。 ST…

产品需求过程管理重要性

产品需求过程管理重要性 背景 以下都是真实事项经历回顾&#xff0c;在产品开发过程中&#xff0c;产品经理与研发团队之间的沟通至关重要。然而&#xff0c;沟通不畅或信息缺失常常导致需求无法准确传达&#xff0c;最终影响产品的成功。以下是一些常见的问题&#xff1a; 1.需…

C++基础【字符串】(Ac-Wing)

字符串加空格 #include <iostream> #include <cstring> #include <algorithm>using namespace std;int main() {string s;getline (cin, s);for (int i 0; i < s.size(); i )cout << s[i] << " "; }字符串插入 #include<bits/…

js处理echarts tooltip定时轮播

echarts tooltip定时轮播 /*** echarts tooltip轮播* param chart ECharts实例* param chartOption echarts的配置信息* param options object 选项* {* interval 轮播时间间隔&#xff0c;单位毫秒&#xff0c;默认为3000* true表示循环所有series的tooltip…

Electron基础(二) 进程通信的ipcMain、contextBridge、ipcRenderer

1.什么是ipcMain 在 Electron 中&#xff0c;ipcMain是一个非常重要的模块&#xff0c;它负责处理从渲染器进程&#xff08;即 Web 页面&#xff09;发送到主进程&#xff08;即 Electron 应用的后台进程&#xff09;的进程间通信&#xff08;IPC&#xff0c;Inter-Process Co…

使用HTTP代理注意的点

“在网络世界中&#xff0c;HTTP代理扮演着桥梁的角色&#xff0c;帮助用户匿名访问网站、加速网页加载、绕过地区限制等。然而&#xff0c;不当或不安全地使用HTTP代理也可能带来一系列问题。以下是在使用HTTP代理时需要注意的几个关键点。” 一、选择可靠的代理服务商 首先&…

鹰眼应急实时三维重建装备,高质量交付中!

在《2024年地方应急管理科技信息化任务书》的指导和应急管理万亿国债支撑下&#xff0c;全国各地正积极推进应急管理现代化建设&#xff0c;全力提升“数据汇聚服务能力、监测预警能力、指挥调度能力、支撑保障能力”四项应急管理能力。 制定标准化流程规范&#xff0c;保障交…

[Leetcode 47][Medium]-全排列 II-回溯(全排列问题)

目录 一、题目描述 二、整体思路 三、代码 一、题目描述 原题地址 二、整体思路 和上一道Leetcode46相比&#xff0c;有变化的地方是要排除重复组合的情况。那么在组合问题中去除重复组合的方法是先对数组进行排序,然后在回溯函数中判断当前元素与上一个元素是否相同,若相同…

DDS(Data Distribution Service)的数据状态分布和管理简单介绍

1. 数据中心模型 在 DDS 中&#xff0c;数据分发是基于数据中心模型的&#xff0c;而不是消息中心模型。数据中心模型强调数据本身的存在和状态变化&#xff0c;而消息中心模型主要关注消息的传递。通过使用数据中心模型&#xff0c;DDS 可以有效地跟踪每个话题的状态&#xf…