{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

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

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

相关文章

DL/T645、IEC104转BACnet网关实现实时数据采集

BA102网关是钡铼技术专为实现电力协议DL/T645、IEC104与楼宇自控协议BACnet相互转化而研发的。它下行采集支持Modbus RTU、Modbus TCP、DL/T645、IEC104等协议&#xff0c;上行转发则支持BACnet IP和BACnet MS/TP协议&#xff0c;从而实现了电力协议与楼宇自控协议之间的相互转…

切换数据失败0x1671分析

1、问题背景 切换双卡数据开关&#xff0c;无法切换成功&#xff0c;且单机必现该问题 2、问题分析 搜索Log发现相关拨号无法建立成功&#xff0c;返回0x1671&#xff0c;无法建立PDN连接。 相关拨号上层未下发相关AT命令&#xff0c;属于上层报错&#xff0c;并非网络问题&…

AI有关的学习和python

一、基本概念 AIGC&#xff08;AI Generated content AI 生成内容&#xff09; AI生成的文本、代码、图片、音频、视频。都可以成为AIGC。 Generative AI&#xff08;生成式AI&#xff09;所生成的内容就是AIGC AI指代计算机人工智能&#xff0c;模仿人类的智能从而解决问题…

解读:基于图的大模型提示技术

【引子】大模型的兴起&#xff0c; 使得读论文成为了学习中的一种常态。如果一篇论文没有读懂&#xff0c;不用担心&#xff0c;可以再读一篇该领域内容相近的论文&#xff0c;量变可能会产生质变。就像编程语言一样&#xff0c;你永远无法精通一门编程语言&#xff0c;除非&am…

为什么idea建议使用“+”拼接字符串

今天在敲代码的时候&#xff0c;无意间看到这样一个提示&#xff1a; 英文不太好&#xff0c;先问问ChatGPT&#xff0c;这个啥意思&#xff1f; IDEA 提示你&#xff0c;可以将代码中的 StringBuilder 替换为简单的字符串连接方式。 提示信息中说明了使用 StringBuilder 进行…

独孤思维:长线副业,越做越香

01 独孤从开始做第一个短视频开始&#xff0c;就做好了长线作战的准备。 IP的短视频&#xff0c;尤其是如今这么卷的情况下&#xff0c;独孤并不期望短时间内涨粉&#xff0c;甚至变现。 还是站在长期主义角度上&#xff0c;去看到短视频。 就如同&#xff0c;独孤做日更写…

nodejs的mysql事务,行锁,表锁

使用事务&#xff08;Transactions&#xff09;&#xff1a; 在 MySQL 中&#xff0c;事务&#xff08;Transaction&#xff09;可以确保一组操作要么全部成功&#xff0c;要么全部失败和回滚&#xff0c;从而保持数据的一致性。使用 connection.beginTransaction() 开始事务&a…

Android APP 音视频(01)MediaCodec解码H264码流

说明&#xff1a; 此MediaCodec解码H264实操主要针对Android12.0系统。通过读取sd卡上的H264码流Me获取视频数据&#xff0c;将数据通过mediacodec解码输出到surfaceview上。 1 H264码流和MediaCodec解码简介 1.1 H264码流简介 H.264&#xff0c;也被称为MPEG-4 AVC&#xff…

SCADA系统智能化管理工厂 操作方便易于使用

SCADA系统是将工厂进行智能化升级的专业系统&#xff0c;可根据需求与预算定制&#xff0c;从多设备的采集、数据的显示、数据可视化展示、分析图像、边缘计算、协议解析、数据转发、数据清洗、数据转换、数据存储、数据传输等等&#xff0c;各种功能均可根据实际需求进行定制&…

如何在测试中保护用户隐私!

在当今数据驱动的时代&#xff0c;用户隐私保护成为了企业和开发团队关注的焦点。在软件测试过程中&#xff0c;处理真实用户数据时保护隐私尤为重要。本文将介绍如何在测试中保护用户隐私&#xff0c;并提供具体的方案和实战演练。 用户隐私保护的重要性 用户隐私保护不仅是法…

Spring MVC 应用分层

1. 类名使⽤⼤驼峰⻛格&#xff0c;但以下情形例外&#xff1a;DO/BO/DTO/VO/AO 2. ⽅法名、参数名、成员变量、局部变量统⼀使⽤⼩驼峰⻛格 3. 包名统⼀使⽤⼩写&#xff0c;点分隔符之间有且仅有⼀个⾃然语义的英语单词. 常⻅命名命名⻛格介绍 ⼤驼峰: 所有单词⾸字⺟…

centos7 mysql 基本测试(7)主从并行简单测试

centos7 mysql 基本测试&#xff08;7&#xff09;主从并行简单测试 重启MySQL服务使配置生效。 注意&#xff1a;并行复制需要slave的硬件资源充足&#xff0c;并且确保网络通信和IO性能不是瓶颈。不是所有的应用场景都适合并行复制&#xff0c;比如写密集型应用或者slave负…

使用api 调试接口 ,配置 Header 、 body 远程调试 线上接口

学习目标&#xff1a; 目标 使用api 调试接口 &#xff0c;配置 Header 、 body 远程调试 线上接口 学习内容&#xff1a; 内容 设置请求方式 2. 选择 POST 提交 3.设置 Header 一般默认的 4个 header 属性就可以直接使用&#xff0c;如有特殊情况&#xff0c;需进行属性设…

『 Linux 』信号的捕捉及部分子问题

文章目录 信号的捕捉sigaction函数未决信号集的置零时机信号处理过程的阻塞可重入函数volatile 关键字SIGCHLD 信号 信号的捕捉 该图为基于信号处理为用户自定义动作的图解; 信号的捕捉 当一个信号被递达时,如果该信号的处理动作是用户自定义的函数(如int sighandler(int))时就…

【AWS基础】AWS服务介绍与基本使用

AWS基础&#xff1a;AWS服务介绍与基本使用 目录 引言AWS概述AWS的核心服务 计算服务存储服务数据库服务网络服务管理和监控服务 AWS的基本使用 创建AWS账户使用EC2实例使用S3存储配置RDS数据库设置VPC网络 AWS的优势AWS的应用场景结论 引言 亚马逊网络服务&#xff08;AWS&…

文物实时状态监控的保护系统

文物是宝贵的历史遗产和文化瑰宝&#xff0c;其保护是我们共同的责任。为了实现文物的安全保护&#xff0c;现代科技提供了各种环境监测设备&#xff0c;可以实时监控文物的状态并采取相应的保护措施。本文将介绍一种利用各种环境监测设备实现文物实时状态监控的保护系统。 一…

【视频讲解】ResNet深度学习神经网络原理及其在图像分类中的应用|附Python代码

全文链接&#xff1a;https://tecdat.cn/?p37134 原文出处&#xff1a;拓端数据部落公众号 分析师&#xff1a;Canglin Li 本文深入探讨了卷积层&#xff08;Convolutional Layer&#xff09;在深度学习框架中的核心作用与操作机制&#xff0c;并分析了其在特征提取、网络构…

近期代码报错解决笔记

1.TypeError: ‘bool’ object is not callable 想print("Type of head:", type(entity_emb[head]))&#xff0c;结果报如下错误&#xff1a; 源代码&#xff1a; 因为 print 仍然被当作一个布尔值处理&#xff0c;而不是作为函数调用。这个问题的根源在于 print …

Android SurfaceFlinger——纹理的绘制流程(二十八)

在系统开机动画的播放流程中,会从给定的资源文件中加载纹理数据并初始化一个 OpenGL 纹理对象,这里我们就来解析软件模拟纹理的绘制流程。 一、纹理概述 在 Android 的 SurfaceFlinger 系统组件中,纹理(Texture)是一个核心概念,特别是在涉及到图形渲染和显示的过程中。 …

关于TS(typescript)的理论知识

关于TS&#xff08;typescript&#xff09;的理论知识 TypeScript 是一种由微软开发的开源编程语言&#xff0c;它是 JavaScript 的一个超集&#xff0c;添加了可选的静态类型和基于类的面向对象编程。TypeScript 最终会被编译成纯 JavaScript 代码&#xff0c;以便在任何支持 …