当前位置: 首页 > news >正文

{Spring Boot 原理篇} Spring Boot自动装配原理

@SpringBootApplication

1,Spring Boot 应用启动,@SpringBootApplication标注的类就是启动类,它去实现配置类中的Bean的自动装配

@SpringBootApplication
public class SpringbootRedis01Application {public static void main(String[] args) {SpringApplication.run(SpringbootRedis01Application.class, args);}}

2,而@SpringBootApplicatiozn注解中包含了三个注解:

@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
//以上四个都为元注解,以下三个才是去实现自动装配的注解
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {@Filter(type = FilterType.CUSTOM,classes = {TypeExcludeFilter.class}
), @Filter(type = FilterType.CUSTOM,classes = {AutoConfigurationExcludeFilter.class}
)}
)

@SpringBootConfiguration

这个注解包含了@Configuration,@Configuration里面又包含了一个@Component注解,也就是

说,这个注解标注在哪个类上,就表示当前这个类是一个配置类,而配置类也是spring容器中的组

件,

@SpringBootConfiguration:对@Configuration 注解的封装,标注当前类是配置类,并会将当前类内声明的一个或多个以@Bean注解标记的方法的实例纳入到spring容器中。

@EnableAutoConfiguration

这个注解是开启自动配置的功能核心注解,里面包含了两个注解

@AutoConfigurationPackage

@Import({AutoConfigurationImportSelector.class})

@AutoConfigurationPackage:

将主启动类的所在包及包下面所有子包里面的所有组件扫描到Spring容器,这也就是为什么我们在利用springboot进行开发的时候,无论是Controller还是Service的路径都是与主配置类同级或者次级的原因。

@Import(AutoConfigurationImportSelector.class)

上一个注解我们把所有组件都加载到了容器里面,这个注解就是将需要自动装配的类以全类名的方

式返回

1、AutoConfigurationImportSelector这个类里面有一个方法selectImports(),如下

2、在selectImport()方法里调用了一个getAutoConfigurationEntry()方法,这个方法里面又调用

了一个getCandidateConfigurations()方法

3、在getCandidateConfigurations()方法里面调用了loadFactoryNames()方法、

 4、loadFactoryNames()方法里面又调用了一个loadSpringFactories()方法

5、关键就在这个loadSpringFactories()方法里面,在这个方法里,它会查找所有在META-INF

6、在META-INF/spring.factories这个文件里面的数据是以键=值的方式存储,然后解析这些文

件,找出以EnableAutoConfiguration为键的所有值,以列表的方式返回

@ComponentScan

这个注解的作用就是扫描当前包及子包的注解

@Condition注解就是在自动装配的时候如果这个类中有此注解而且满足其定义的逻辑,是否要注入容器。

定义自己的条件类,实现Condition口重写match方法

public class ClassCondition implements Condition {
//条件为是否导入相应坐标而且是单个条件
//    @Override
//    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
//        boolean flag=true;
//        try {
//            Class<?> clas= Class.forName("redis.clients.jedis.Jedis");
//        } catch (ClassNotFoundException e) {
//
//           flag=false;
//        }
//
//        return flag;
//    }
//条件为是否导入相应坐标而且是多个条件@Overridepublic boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {boolean flag=true;Map<String, Object> map = metadata.getAnnotationAttributes(ConditionOnClasss.class.getName());String[] value = (String[]) map.get("value");try {for(String className :value) {Class<?> clas = Class.forName(className);}} catch (ClassNotFoundException e) {flag=false;}return flag;}
}

定义配置类:@Condition(value属性指的就是条件类)

@Configuration
public class UserConfig {@Bean
//    @Conditional(value = ClassCondition.class)@ConditionOnClasss(value={"com.alibaba.fastjson.JSON","redis.clients.jedis.Jedis"})public Hotel hotel(){return new Hotel();}@Bean
//    @Conditional(value = ClassCondition.class)
//    @ConditionOnClasss(value={"com.alibaba.fastjson.JSON","redis.clients.jedis.Jedis"})@ConditionalOnProperty(value = "k1",havingValue = "k2")public Hotel hotel2(){return new Hotel();}}

Condition – 小结

自定义条件:

① 定义条件类:自定义类实现Condition接口,重写 matches 方法,在 matches 方法中进行逻辑判 断,返回 boolean值 。

        matches 方法两个参数:

                • context:上下文对象,可以获取属性值,获取类加载器,获取BeanFactory等。

                • metadata:元数据对象,用于获取注解属性。

② 判断条件: 在初始化Bean时,使用 @Conditional(条件类.class)注解

SpringBoot 提供的常用条件注解: 

          以下注解在springBoot-autoconfigure的condition包下 :

ConditionalOnProperty:判断配置文件中是否有对应属性和值才初始化

Bean ConditionalOnClass:判断环境中是否有对应字节码文件才初始化Bean ConditionalOnMissingBean:判断环境中没有对应Bean才初始化Bean

ConditionalOnBean:判断环境中有对应Bean才初始化Bean 可以查看RedisAutoConfiguration类说明以上注解使用 距离演示ConditionalOnProperty

相关文章:

{Spring Boot 原理篇} Spring Boot自动装配原理

SpringBootApplication 1&#xff0c;Spring Boot 应用启动&#xff0c;SpringBootApplication标注的类就是启动类&#xff0c;它去实现配置类中的Bean的自动装配 SpringBootApplication public class SpringbootRedis01Application {public static void main(String[] args)…...

QEMU源码全解析 —— CPU虚拟化(10)

接前一篇文章: 本文内容参考: 《趣谈Linux操作系统》 —— 刘超,极客时间 《QEMU/KVM》源码解析与应用 —— 李强,机械工业出版社 《深度探索Linux系统虚拟化原理与实现》—— 王柏生 谢广军, 机械工业出版社 特此致谢! 二、x86架构CPU虚拟化 3. VMX 上一回讲解了支…...

46、PHP实现矩阵中的路径

题目&#xff1a; PHP实现矩阵中的路径 描述&#xff1a; 请设计一个函数&#xff0c;用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。 路径可以从矩阵中的任意一个格子开始&#xff0c;每一步可以在矩阵中向左&#xff0c;向右&#xff0c;向上&#xff0c;向…...

c++笔记2

目录 2.2 栈底&#xff08;bottom&#xff09; } 大数乘大数 节点&#xff1a;包含一个数据元素及若干指向子树分支的信息 。 节点的度&#xff1a;一个节点拥有子树的数目称为节点的度 。 叶子节点&#xff1a;也称为终端节点&#xff0c;没有子树的节点或者度为零的节点…...

通过Lua脚本手写redis分布式锁

1、手写 Redis 分布式锁&#xff0c;包括上锁、解锁、自动续期。 此功能实现采用 Lua脚本实现&#xff0c;Lua脚本可以保证原子性。 setnx可以实现分布式锁&#xff0c;但是无法实现可重入锁&#xff0c;所以用hset来代替setnx实现可重入的分布式锁。 -- lock if redis.call…...

解析银行个人征信系统

银行个人征信系统&#xff0c;也被称为个人信用信息基础数据库或金融信用信息基础数据库&#xff0c;是我国社会信用体系的重要基础设施。该系统由中国人民银行组织国内相关金融机构建立&#xff0c;旨在依法采集、整理、保存、加工自然人&#xff08;法人&#xff09;及其他组…...

AttributeError: ‘list‘ object has no attribute ‘text‘

AttributeError: ‘list‘ object has no attribute ‘text‘ 目录 AttributeError: ‘list‘ object has no attribute ‘text‘ 【常见模块错误】 【解决方案】 示例代码 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英…...

Codeforces Round 874 (Div. 3)(A~D题)

A. Musical Puzzle 思路: 用最少的长度为2的字符串按一定规则拼出s。规则是&#xff1a;前一个字符串的尾与后一个字符串的首相同。统计s中长度为2的不同字符串数量。 代码: #include<bits/stdc.h> #include <unordered_map> using namespace std; #define N 20…...

[Python][基础语法]详细讲解

目录 1.顺序语句2.条件语句3.缩进和代码块4.空语句 pass5.循环语句1.while2.for3.continue4.break ∞.积累 1.顺序语句 默认情况下&#xff0c;Python的代码执行顺序是按照从上到下的顺序&#xff0c;依次执行# 输出结果&#xff1a;"123" print("1") pri…...

Layui---输入事件

输入实时监听 //监听表单单选框复选框选择 form.on(radio, function (data) {console.log(data.value); //得到被选中的值 });//监听表单下拉菜单选择form.on(select, function (data) //监听表单下拉菜单选择form.on(select, function (data) ​ //监听表单复选框选择form.…...

甄选范文“论软件测试中缺陷管理及其应用”软考高级论文,系统架构设计师论文

论文真题 软件缺陷指的是计算机软件或程序中存在的某种破坏正常运行能力的问题、错误,或者隐藏的功能缺陷。缺陷的存在会导致软件产品在某种程度上不能满足用户的需要。在目前的软件开发过程中,缺陷是不可避免的。软件测试是发现缺陷的主要手段,其核心目标就是尽可能多地找…...

spring框架实现滑动验证码功能

spring框架实现滑动验证码功能 1. 整体描述2. 具体实现2.1 滑动验证码实体类2.2 滑动验证码登录VO2.3 滑动验证码接口返回类2.4 滑动验证码工具类2.5 滑动验证码Service2.6 滑动验证码Controller 3 工程源码4 总结 1. 整体描述 之前项目需要在验证码模块&#xff0c;增加滑动验…...

Pytorch使用教学8-张量的科学运算

在介绍完PyTorch中的广播运算后&#xff0c;继续为大家介绍PyTorch的内置数学运算&#xff1a; 首先对内置函数有一个功能印象&#xff0c;知道它的存在&#xff0c;使用时再查具体怎么用其次&#xff0c;我还会介绍PyTorch科学运算的注意事项与一些实用小技巧 1 基本数学运算…...

[Spring Boot]登录密码三种加密方式

简述 介绍其三种密码加密方法 1.SM2加密与验签 2.随机密码盐加密 3.MD5加密 推荐使用方法1&#xff0c;其次使用方法2&#xff0c;最不推荐的是方法3。方法3极其容易被密码字典破解&#xff0c;如果项目进行安全测试&#xff0c;通常是不允许的加密方式。 SM2加密与验签 引入…...

前端面试项目细节重难点分享(十三)

面试题提问&#xff1a;分享你最近做的这个项目&#xff0c;并讲讲该项目的重难点&#xff1f; 答&#xff1a;最近这个项目是一个二次迭代开发项目&#xff0c;迭代周期一年&#xff0c;在做这些任务需求时&#xff0c;确实有很多值得分享的印象深刻的点&#xff0c;我讲讲下面…...

每天五分钟深度学习:向量化方式完成逻辑回归m个样本的前向传播

本文重点 我们已经知道了向量化可以明显的加速程序的运行速度,本节课程将使用向量化来完成逻辑回归的前向传播,不使用一个for循环。 逻辑回归的前向传播 我们先来回忆一下逻辑回归的前向传播,如果我们有m个训练样本,首先对第一个样本进行预测,我们需要计算z,然后计算预…...

以线程完成并发的UDP服务端

网络(九)并发的UDP服务端 以线程完成功能 客户端 // todo UDP发送端 #include <stdio.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <sys/types.h> #include <stdlib.h> #include <string.h…...

linux c 特殊字符分割

/* * brief: 根据split_symbol分割字符串 * param: str为要分割的字符串&#xff0c;split_symbol是分隔符 * return&#xff1a;返回garray的指针数组&#xff0c;如果返回非空需要自己处理释放 */ GPtrArray_autoptr char_sz_spilt(pchar* str, pchar split_symbol) {if (NUL…...

搭建本地私有知识问答系统:MaxKB + Ollama + Llama3 (wsl网络代理配置、MaxKB-API访问配置)

目录 搭建本地私有知识问答系统:MaxKB、Ollama 和 Llama3 实现指南引言MaxKB+Ollama+Llama 3 Start buildingMaxKB 简介:1.1、docker部署 MaxKB(方法一)1.1.1、启用wls或是开启Hyper使用 WSL 2 的优势1.1.2、安装docker1.1.3、docker部署 MaxKB (Max Knowledge Base)MaxKB …...

谷粒商城实战笔记-65-商品服务-API-品牌管理-表单校验自定义校验器

文章目录 1&#xff0c;el-form品牌logo图片自定义显示2&#xff0c;重新导入和注册element-ui组件3&#xff0c;修改brand-add-or-update.vue控件的表单校验规则firstLetter 校验规则sort 校验规则 1&#xff0c;el-form品牌logo图片自定义显示 为了在品牌列表中自定义显示品…...

017、Docker在TinyML开发中的应用

017 Docker在TinyML开发中的应用 从一次“环境地狱”说起 上个月帮团队调一个STM32上的TinyML推理延迟问题,模型是MobileNetV2量化版,在开发板上跑得好好的,换到同事的Ubuntu 20.04机器上编译,死活链接不上CMSIS-NN库。折腾半天发现他系统里默认的arm-none-eabi-gcc版本是…...

RTX 5090功耗600W:高功耗显卡的系统级挑战与实战装机指南

1. 项目概述&#xff1a;从一则功耗新闻到显卡生态的深度解构最近&#xff0c;一则关于英伟达下一代旗舰显卡RTX 5090功耗可能高达600W的消息&#xff0c;在硬件圈和AI计算领域激起了不小的波澜。对于普通玩家而言&#xff0c;这或许只是一个“电老虎”又升级了的谈资&#xff…...

Arm Neoverse CMN-700架构与寄存器配置详解

1. Arm Neoverse CMN-700架构概览在现代多核处理器设计中&#xff0c;如何高效实现缓存一致性一直是核心挑战。Arm Neoverse CMN-700&#xff08;Coherent Mesh Network&#xff09;作为第二代一致性网格网络IP&#xff0c;采用分布式架构解决了从16核到256核规模的数据一致性问…...

CircuitPython实战:I2S音频播放与asyncio异步编程构建智能温度监测系统

1. 项目概述与核心价值如果你正在寻找一种能让你的嵌入式项目“开口说话”或者“耳听八方”的方案&#xff0c;I2S音频绝对是你绕不开的技术。不同于我们熟悉的模拟音频&#xff0c;I2S是一种纯粹的数字音频传输协议&#xff0c;它通过三根线——时钟、声道选择和数据——就能传…...

PaperDebugger:用代码调试思维提升学术论文可复现性的工具实践

1. 项目概述&#xff1a;一个为学术论文“排雷”的智能调试器如果你和我一样&#xff0c;常年混迹在学术圈或者技术研发一线&#xff0c;肯定对下面这个场景深恶痛绝&#xff1a;好不容易读完一篇几十页的论文&#xff0c;满心欢喜地准备复现其中的算法或实验&#xff0c;结果发…...

嘎嘎降AI和PaperRR深度对比:2026年学术期刊SCI论文降AI性能完整评测报告

嘎嘎降AI和PaperRR深度对比&#xff1a;2026年学术期刊SCI论文降AI性能完整评测报告 总有人问我选哪个降AI工具&#xff0c;这篇文章把主流的几款对比清楚。 综合推荐嘎嘎降AI&#xff08;www.aigcleaner.com&#xff09;&#xff0c;4.8元&#xff0c;99.26%达标率。不同需求…...

CodeWeaver:多仓库聚合分析工具的设计、部署与实战指南

1. 项目概述与核心价值最近在折腾一个老项目&#xff0c;需要把一堆陈年的、用不同语言和框架写的代码仓库整合到一个统一的视图里进行管理和分析。手动去每个仓库里翻看提交记录、统计代码行数、检查依赖关系&#xff0c;这活儿想想就头大。就在我准备硬着头皮写脚本的时候&am…...

WCH CH348L USB转多串口芯片实战:6路UART+2路RS485工业网关设计与电平兼容方案

1. CH348L芯片深度解析&#xff1a;为什么它是工业网关的理想选择 第一次拿到CH348L这颗芯片的时候&#xff0c;我正被一个工业现场的数据采集项目折磨得焦头烂额。现场有6台不同品牌的PLC需要通过串口通信&#xff0c;还有2个RS485总线的温控器需要接入&#xff0c;传统的解决…...

SAP F110自动付款:从零到精通的配置全景图

1. SAP F110自动付款入门指南 第一次接触SAP F110自动付款功能时&#xff0c;我也被那一堆配置项搞得晕头转向。记得当时为了搞清楚银行确定逻辑&#xff0c;整整花了两天时间反复测试。现在回想起来&#xff0c;如果有个系统性的指导手册&#xff0c;至少能节省一半时间。F110…...

Playnite完整指南:高效统一你的跨平台游戏库管理体验

Playnite完整指南&#xff1a;高效统一你的跨平台游戏库管理体验 【免费下载链接】Playnite Video game library manager with support for wide range of 3rd party libraries and game emulation support, providing one unified interface for your games. 项目地址: http…...