Spring Boot进阶 - 实现自动装配原理
Spring Boot的自动装配(Auto-Configuration)是其核心特性之一,它极大地简化了Spring应用的配置过程。自动装配的原理基于Spring框架的@Configuration、@ConditionalOnClass、@ConditionalOnMissingBean等注解,以及Spring Boot提供的spring.factories文件机制。下面详细解释其实现原理:
1. @SpringBootApplication
首先,Spring Boot应用通常会有一个带有@SpringBootApplication注解的入口类。这个注解是一个组合注解,它包含了@SpringBootConfiguration、@EnableAutoConfiguration和@ComponentScan三个核心注解。
@SpringBootConfiguration继承自@Configuration,标记该类为配置类,其中可以包含@Bean定义来注册bean到Spring容器。@EnableAutoConfiguration是自动配置的核心,它通过@Import(AutoConfigurationImportSelector.class)导入需要的配置类。@ComponentScan用于扫描当前包及其子包下的组件,包括@Component、@Service、@Repository、@Controller等注解标记的类。
2. AutoConfigurationImportSelector
当@EnableAutoConfiguration被处理时,AutoConfigurationImportSelector会被调用。这个类负责决定哪些自动配置类需要被加载。它主要通过以下几个步骤实现:
- 查找候选配置类:从
META-INF/spring.factories文件中读取所有org.springframework.boot.autoconfigure.EnableAutoConfiguration的值,这些就是自动配置的候选类。 - 过滤候选配置类:根据当前应用的类路径(即项目依赖的jar包)、已存在的bean、以及其他条件注解(如
@ConditionalOnClass、@ConditionalOnMissingBean等)来决定哪些候选配置类应该被实际使用。
3. 条件注解
自动装配的核心在于条件注解,比如:
@ConditionalOnClass:只有当指定的类存在于类路径上时,才加载对应的配置。@ConditionalOnMissingBean:如果应用上下文中不存在某个bean,则创建该bean。@ConditionalOnProperty:根据配置文件中的属性值决定是否加载配置。
这些注解使得自动配置具有很高的灵活性和智能性,能够根据应用的实际环境和需求动态调整配置。
4. 示例
假设有一个MyAutoConfiguration类,它使用了@Configuration和一些条件注解来定义一个bean。当满足条件注解指定的条件时,Spring Boot在启动过程中会自动发现并注册这个bean。
@Configuration
@ConditionalOnClass(MyService.class)
public class MyAutoConfiguration {@Bean@ConditionalOnMissingBeanpublic MyService myService() {return new MyServiceImpl();}
}
总结
Spring Boot的自动装配机制通过@SpringBootApplication、@EnableAutoConfiguration、AutoConfigurationImportSelector、条件注解以及spring.factories文件的配合,实现了根据应用环境自动配置bean的功能,大大减轻了开发者的手动配置工作,提高了开发效率。开发者只需关注业务逻辑,而大部分基础设施和服务的配置由Spring Boot自动处理。
相关文章:
Spring Boot进阶 - 实现自动装配原理
Spring Boot的自动装配(Auto-Configuration)是其核心特性之一,它极大地简化了Spring应用的配置过程。自动装配的原理基于Spring框架的Configuration、ConditionalOnClass、ConditionalOnMissingBean等注解,以及Spring Boot提供的s…...
面向电商家居行业3D室内场景合成中的空间感知
本文主要介绍了3D场景合成技术在电商领域,尤其是家居家装行业的应用。它解释了如何使用3D场景合成创建逼真的室内设计,让消费者能够交互式地查看和体验产品,提高购物的趣味性和效率。文章提到了两种主要的3D室内场景生成算法:传统…...
ERROR 1045 (28000) Access denied for user ‘root‘@‘IP‘(using password YES/NO)
查看权限 要查看MySQL用户的权限,您可以使用SHOW GRANTS语句。这将列出用户的权限,包括授予的权限和可以授予其他用户的权限。 以下是查看当前用户权限的SQL命令: SHOW GRANTS; 如果您想查看特定用户的权限,可以使用以下命令&…...
verilog $test$plusargs和$value$plusargs
#学习记录# 目录 Abstract 1 使用宏定义的条件编译 2 $test$plusargs 3 $value$plusargs 参考文献 Abstract 我们在进行verilog仿真时,经常喜欢采用宏定义,来做条件判断,但是通过宏定义做条件判断的这种方法,存在很大的弊端…...
Linux设置open files
临时设置 ulimit -n 1025 查看是否成功 ulimit -n 永久设置,网上很多说添加* soft nofile 65535 * hard nofile 65535但设置后不生效 vim /etc/security/limits.conf * soft nofile 65535 * hard nofile 65535 * soft nproc 65535 * hard nproc 65535 然后重新…...
Linux下安装JDK并配置环境变量
一、Oracle官网下载jdk 1、官网地址 https://www.oracle.com/java/technologies/downloads/#java17 2、命令下载 wget https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.tar.gz 3、解压 tar -zxvf jdk-17_linux-x64_bin.tar.gz 4、配置环境变量 ec…...
擎天科技与禅道合作,打造统一的项目管理平台
统一、全面的项目管理平台能够帮助企业优化管理流程,提升业务效率。擎天集团选择与禅道软件合作,打造统一的项目管理平台,在降低自研软件的研发成本、打破团队信息孤岛、保障数据全面性等方面效果显著,大大提高了团队沟通协作效率…...
ansible报错解决:Failed to import the required Python library (netaddr)
ansible报错解决:Failed to import the required Python library (netaddr) 问题情况 今天我在做实验的时候出现了一个问题,以下是我的playbook,这个playbook是验证变量ip_address是否是一个合法的IP地址,并打印相应的信息的一个…...
盛邦安全拟战略收购卫星通信加密厂商天御云安
近日,远江盛邦(北京)网络安全科技股份有限公司(以下简称“盛邦安全”,股票代码:688651)对外公布,拟使用自有资金不超过人民币3000万元持有北京天御云安科技有限公司(以下简称“天御云安”&#…...
iOS MRC那句话
混编时使用MRC文件需要使用这句话 -fno-objc-arc在下图中显示的位置添加...
macOS DOSBox 汇编环境搭建
正文 一、安装DOSBox 首先前往DOSBox的官网下载并安装最新版本的DOSBox。 二、下载必备的工具包 在用户目录下新建一个文件夹,比如 dosbox: mkdir dosbox然后下载一些常用的工具。下载好了后,将这些工具解压,重新放在 dosbox 这个文件夹…...
Python深度学习基于Tensorflow(1)Numpy基础
文章目录 数据转换和数据生成存取数据数据变形和合并算数计算广播机制使用Numpy实现回归实例 numpy的重要性不言而喻,一般不涉及到GPU/TPU计算,都是用numpy,常见的np就是这个玩意。其特点就是快!其实如果不涉及到深度学习…...
体验GM CHM Reader Pro,享受高效阅读
还在为CHM文档的阅读而烦恼吗?试试GM CHM Reader Pro for Mac吧!它拥有强大的功能和出色的性能,能够让你轻松打开和阅读CHM文件,享受高效、舒适的阅读体验。无论是学习、工作还是娱乐,GM CHM Reader Pro都能成为你的得…...
校园网拨号上网环境下多开虚拟机,实现宿主机与虚拟机互通,并访问外部网络
校园网某些登录客户端只允许同一时间一台设备登录,因此必须使用NAT模式共享宿主机的真实IP,相当于访问外网时只使用宿主机IP,此方式通过虚拟网卡与物理网卡之间的数据转发实现访问外网及互通 经验证,将centos的物理地址与主机物理…...
cpu常用命令
1.平台信息 # 读节点 adb shell "cat proc/cpuinfo" # 读属性 adb shell getprop ro.hardware 2.负载信息 # 负载信息 adb shell dumpsys cpuinfo 3.原生定频 # 频率档位 adb shell "cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_available_frequencies&q…...
Vue3实战笔记(06)--- Axios 基本用法
文章目录 前言一、发送get请求二、发送post请求三、另一种写法总结 前言 今天学习Vue官方推荐的请求工具Axios ,Axios 是一个基于 promise 的 HTTP 库,可用于浏览器和 node.js 中。它简洁、易用且功能强大,支持多种请求类型(GET、…...
使用单片机在图形点阵LCD上绘制波形图
使用单片机在图形点阵LCD上绘制波形图 需求: 假如有一组浮点数据,是通过AD转换得到的,保存在数组MyArray[]中,采集点数为len,采集周期为T,现在想用单片机在LCD上绘制出这组数据对应的波形图,该…...
生信人写程序1. Perl语言模板及配置
生物信息领域常用语言 个人认为:是否能熟悉使用Shell(项目流程搭建)R(数据统计与可视化)Perl/Python/Java…(胶水语言,数据格式转换,软件间衔接)三门语言是一位合格生物信息工程师的标准。 生物信息常用语言非常广泛,我常用的有…...
【Android】Kotlin学习之数据容器 -- 集合
一. 定义 List : 是一个有序列表, 可通过下标访问元素. 元素可以在list中出现多次, 元素可重复 Set : 是元素唯一的集合, 一般来说Set中元素的顺序并不重要, 无序集合. Map : 是一组键值对, 键是唯一的, 每个键刚好映射到一个值, 值可以重复 二. 集合创建 三. 示例 mutabl…...
超详细 springboot 整合 Mock 进行单元测试!本文带你搞清楚!
文章目录 一、什么是Mock1、Mock定义2、为什么使用3、常用的Mock技术4、Mokito中文文档5、集成测试和单元测试区别 二、API1、Mockito的API2、ArgumentMatchers参数匹配3、OngoingStubbing返回操作 三、Mockito的使用1、添加Maven依赖2、InjectMocks、Mock使用3、SpringbootTes…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...
涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...
Caliper 负载(Workload)详细解析
Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...
嵌入式常见 CPU 架构
架构类型架构厂商芯片厂商典型芯片特点与应用场景PICRISC (8/16 位)MicrochipMicrochipPIC16F877A、PIC18F4550简化指令集,单周期执行;低功耗、CIP 独立外设;用于家电、小电机控制、安防面板等嵌入式场景8051CISC (8 位)Intel(原始…...
区块链技术概述
区块链技术是一种去中心化、分布式账本技术,通过密码学、共识机制和智能合约等核心组件,实现数据不可篡改、透明可追溯的系统。 一、核心技术 1. 去中心化 特点:数据存储在网络中的多个节点(计算机),而非…...
一些实用的chrome扩展0x01
简介 浏览器扩展程序有助于自动化任务、查找隐藏的漏洞、隐藏自身痕迹。以下列出了一些必备扩展程序,无论是测试应用程序、搜寻漏洞还是收集情报,它们都能提升工作流程。 FoxyProxy 代理管理工具,此扩展简化了使用代理(如 Burp…...
WebRTC调研
WebRTC是什么,为什么,如何使用 WebRTC有什么优势 WebRTC Architecture Amazon KVS WebRTC 其它厂商WebRTC 海康门禁WebRTC 海康门禁其他界面整理 威视通WebRTC 局域网 Google浏览器 Microsoft Edge 公网 RTSP RTMP NVR ONVIF SIP SRT WebRTC协…...
