宿迁做网站 宿迁网站建设/美业推广平台

宿迁做网站 宿迁网站建设,美业推广平台,用php做的网站有哪些,生产企业网站如何做seo文章目录 前言一、SpringBootConfiguration二、EnableAutoConfiguration2.1、AutoConfigurationPackage2.2、Import(AutoConfigurationImportSelector.class) 三、ComponentScan四、自动配置源码4.1、获取所有候选的自动配置类4.2、过滤不满足条件的自动配置 总结 前言 在常规的…

文章目录

  • 前言
  • 一、@SpringBootConfiguration
  • 二、@EnableAutoConfiguration
    • 2.1、@AutoConfigurationPackage
    • 2.2、@Import(AutoConfigurationImportSelector.class)
  • 三、@ComponentScan
  • 四、自动配置源码
    • 4.1、获取所有候选的自动配置类
    • 4.2、过滤不满足条件的自动配置
  • 总结


前言

  在常规的SSM项目中,通常需要用户自己去进行Spring、Spring MVC、Mybatis的整合,以及Tomcat的配置。而在Spring Boot项目中,整合工作已经由Spring Boot去完成,通常我们会引入:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>

  的依赖,在spring-boot-starter-web中就已经完成了Spring、Spring MVC、Tomcat的整合,通常被称为自动配置
在这里插入图片描述  而完成自动配置的关键,在于启动类上的@SpringBootApplication注解:
在这里插入图片描述

  @SpringBootApplication是一个复合注解,其中包含了@SpringBootConfiguration@EnableAutoConfiguration@ComponentScan
在这里插入图片描述

一、@SpringBootConfiguration

  @SpringBootConfiguration注解,没什么好说的,主要作用是将标注了该注解的类标记为配置类(通常是启动类),并且该配置类还会作为一个Bean放入Spring容器中。
在这里插入图片描述  @Configuration注解包含了@Component
在这里插入图片描述

二、@EnableAutoConfiguration

  @EnableAutoConfiguration是三个注解中最重要的一个,自动配置的源码就在该注解中有所体现,它也是一个复合注解,包含了@AutoConfigurationPackage@Import
在这里插入图片描述

2.1、@AutoConfigurationPackage

  @AutoConfigurationPackage上使用了@Import注解,导入了AutoConfigurationPackages类,当执行该类的register方法时(执行时机:Spring的refresh方法扫描配置类并解析时),会尝试向bean定义中注册一个类型为BasePackagesBeanDefinition的Bean,其中的basePackages属性存放的就是当前配置类所在的包路径。
在这里插入图片描述  该包路径可以给其他jar包使用,例如MyBatis的扫描逻辑。

2.2、@Import(AutoConfigurationImportSelector.class)

  在@EnableAutoConfiguration中,还使用@Import注解去导入了AutoConfigurationImportSelector类,该类中的逻辑是自动配置的关键:
在这里插入图片描述  AutoConfigurationImportSelector类实现了DeferredImportSelector接口。DeferredImportSelector从名称上看,似乎是在ImportSelector的基础上增加了延迟的功能,实际上DeferredImportSelector也是继承了ImportSelector
在这里插入图片描述  为什么要实现DeferredImportSelector接口?先看一个案例,这个案例的目的是进行条件装配,假如项目中没有自定义的User对象,就在配置类中创建一个User。

public class RagdollCatConfiguration {@Bean@ConditionalOnMissingBean(User.class)public User user(){return new User("从RagdollCatConfiguration创建");}
}
public class RagdollCatImportSelector implements ImportSelector {@Overridepublic String[] selectImports(AnnotationMetadata importingClassMetadata) {return new String[]{"com.itbaima.boot.RagdollCatConfiguration"};}
}
@SpringBootApplication
@Import(RagdollCatImportSelector.class)
public class StartApplication {@Beanpublic User user(){return new User("从StartApplication创建");}public static void main(String[] args) {SpringApplication.run(StartApplication.class,args);}
}

  预期的结果是,控制台打印从RagdollCatConfiguration创建。但是最终的结果是报错:
在这里插入图片描述  原因在于Spring的refresh方法中,解析配置文件的顺序问题:
在这里插入图片描述解析@Import注解

  在ConfigurationClassParser#processImports中,因为案例中的RagdollCatImportSelector 没有实现DeferredImportSelector接口,所以走的是else的逻辑,即执行RagdollCatImportSelector 的select方法,拿到配置类路径,然后解析配置类RagdollCatConfiguration 的内容。
在这里插入图片描述  也就是说,RagdollCatConfiguration 中的代码,会先于StartApplication 中的执行,而在执行RagdollCatConfiguration 中的条件装配时,Spring容器中肯定是没有User的,在这里就会创建。而在StartApplication 中尝试再次将User注册成Bean,就会出现上面的错误。

  这样的结果很明显不符合预期,我们是希望用户自定义Bean的优先级,要高于Spring Boot条件装配的优先级。解决的方法在上图中也有所体现,即实现DeferredImportSelector接口:

public class RagdollCatImportSelector implements DeferredImportSelector {@Overridepublic String[] selectImports(AnnotationMetadata importingClassMetadata) {return new String[]{"com.itbaima.boot.RagdollCatConfiguration"};}
}

  最终的效果是用户自定义的Bean先于Spring Boot的条件装配执行:

在这里插入图片描述


  但是在AutoConfigurationImportSelector中,执行的并非是selectImports的逻辑。
在这里插入图片描述  因为该类同时还重写了getImportGroup方法:
在这里插入图片描述  实际执行的是AutoConfigurationGroupprocess方法:
在这里插入图片描述  而process方法,最终同样会调用到selectImports中的getAutoConfigurationEntry方法,该方法是自动配置的核心方法

三、@ComponentScan

  @ComponentScan是进行路径扫描的注解,如果没有指定路径,默认是扫描标注了@ComponentScan注解的类,所在包下的所有类。而重点要看的是其中的两个排除条件:
在这里插入图片描述  第一个排除条件,是用户自定义了实现TypeExcludeFilter的类,然后重写了其中的match方法:
在这里插入图片描述

public class MyACI implements ApplicationContextInitializer {@Overridepublic void initialize(ConfigurableApplicationContext applicationContext) {applicationContext.getBeanFactory().registerSingleton("typeExcludeFilter",new TypeExcludeFilter(){@Overridepublic boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException {return metadataReader.getClassMetadata().getClassName().equals("com.itbaima.boot.User");}});}
}

  满足条件即被排除:
在这里插入图片描述
  第二个排除条件,是排除掉自动配置类:
在这里插入图片描述

四、自动配置源码

  selectImports中的getAutoConfigurationEntry方法是自动配置的核心源码:

protected AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) {// 1. 检查 @EnableAutoConfiguration 是否启用if (!isEnabled(annotationMetadata)) {return EMPTY_ENTRY;}// 2. 获取 @EnableAutoConfiguration 注解的属性(如果有的话)AnnotationAttributes attributes = getAttributes(annotationMetadata);// 3. 获取所有候选的自动配置类(从 META-INF/spring.factories 或 AutoConfiguration.imports 加载)List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);// 4. 去重,防止重复加载configurations = removeDuplicates(configurations);// 5. 获取所有被排除的自动配置类(@EnableAutoConfiguration(exclude = xxx.class) 或 spring.autoconfigure.exclude 配置)Set<String> exclusions = getExclusions(annotationMetadata, attributes);// 6. 校验是否有错误的排除类(比如排除的类根本不存在)checkExcludedClasses(configurations, exclusions);// 7. 从候选配置中移除排除的配置类configurations.removeAll(exclusions);// 8. 过滤不满足条件的自动配置(基于 @ConditionalOnClass、@ConditionalOnProperty 等条件)configurations = getConfigurationClassFilter().filter(configurations);// 9. 触发自动配置导入事件(给监听器用)fireAutoConfigurationImportEvents(configurations, exclusions);// 10. 返回最终的自动配置类列表return new AutoConfigurationEntry(configurations, exclusions);
}

  重点看一下其中的3和8。

4.1、获取所有候选的自动配置类

  Spring Boot是如何知道那些jar包需要自动装配的?首先在getCandidateConfigurations方法中,会从spring.factories文件中获取所有的自动配置类(也会获取自己项目中定义的spring.factories文件中的,以及第三方jar包中META-INF的spring.factories):
在这里插入图片描述spring.factories  spring-boot-autoconfigure中的spring.factories:
在这里插入图片描述  点进去发现都是一些条件装配类。重点看类上的@ConditionalOnClass注解。只有当前项目的依赖中有@ConditionalOnClass注解标注的类,该配置才会生效,这些类都是对应依赖项的核心类。(例如下图,只有项目中引入了RabbitMQ 相关的依赖,它才会生效)
在这里插入图片描述  但是在获取所有候选的自动配置类这一步,会拿到全量的:
在这里插入图片描述

4.2、过滤不满足条件的自动配置

  在fliter方法中,拿到三个默认的filter,调用match方法进行条件匹配:
在这里插入图片描述  对于4.1中拿到的所有自动配置类,进行条件匹配:
在这里插入图片描述  在进行类条件匹配时,还会去开启多线程执行:
在这里插入图片描述  在这里才会真正去执行spring.factories中具体每个配置项的@ConditionalOnClass等条件装配注解的匹配,会过滤掉项目中没有对应依赖的配置项。
在这里插入图片描述

总结

  Spring Boot的@SpringBootApplication是一个复合注解,包含了:

  • @SpringBootConfiguration:标记当前类是配置类,并且将当前类加入Spring 容器。
  • @EnableAutoConfiguration:将当前类所在的包路径注册到bean定义,并且进行自动配置。(实现了DeferredImportSelector接口,以用户自定义的bean优先。)
  • @ComponentScan:默认扫描当前类所在的包下的所有类。两个排除条件:实现了TypeExcludeFilter接口,重写的match方法的逻辑,以及其他自定义的自动配置类。

  即:标注了@SpringBootApplication的类,自身就作为Spring 的配置类。Spring会去扫描该类所在的包下的所有类。当然@SpringBootApplication也可以不标注在启动类上。并且Spring Boot 自动配置的实现,依靠:

  • META-INF下的spring.factories文件(自身以及第三方jar包的,可以称为SPI机制)
  • 条件装配,@ConditionalOnClass等注解。

  同时在@ConditionalOnClass的实现中,进行条件装配还会开启多线程执行(2个线程),提高效率。

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

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

相关文章

Trae-中国首款免费AI原生IDE

Trae 简介 Trae 是由字节跳动于2025年1月推出的国内首个原生AI集成开发环境&#xff08;IDE&#xff09;&#xff0c;旨在通过AI技术赋能开发者&#xff0c;简化编程流程。其核心功能基于Claude 3.5和GPT-4o等先进AI模型&#xff0c;支持智能代码生成、优化及多模态交互&#…

游戏开发中的贝塞尔曲线:感受丝滑的数学之美

这是一篇vip文章,如果你还不是vip,可以移步https://www.ilikexff.cn/articles/165免费阅读。 介绍 贝塞尔曲线是计算机图形学中最重要的概念之一,以其在表示曲线时的灵活性和精确性而闻名。广泛应用于计算机图形学、动画、路径规划等领域的数学曲线。 贝塞尔曲线的数学原理基…

强化学习课程:stanford_cs234 学习笔记(2)introduction to RL

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言5、强化学习课程大纲5.1 课程内容主&#xff1a;5.2 马尔可夫决策过程&#xff1a;5.2.1 马尔可夫性 markov propterty5.2.2 马尔可夫过程 markov process5.2.3…

第 26 场 蓝桥月赛 部分题解

第 26 场 蓝桥月赛 2.灯笼猜谜3.元宵分配4.摆放汤圆5.元宵交友&#xff08;运行超时 通过90%&#xff09; 2.灯笼猜谜 分析&#xff1a;以当前位置为视角&#xff0c;要想移动的距离尽可能的少&#xff0c;按顺序猜谜语&#xff0c;给你一个区间&#xff0c;有三种情况&#xf…

JAVA实战开源项目:体育馆使用预约平台(Vue+SpringBoot) 附源码

本文项目编号 T 144 &#xff0c;文末自助获取源码 \color{red}{T144&#xff0c;文末自助获取源码} T144&#xff0c;文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…

深度学习之卷积

从全连接到卷积 MLP的缺陷&#xff0c;假设有如下的场景&#xff1a; 分类猫和狗的图片 使用一个还不错的相机采集图片&#xff08;12M像素)RGB图片有 36M元素使用100大小的单隐藏层MLP&#xff0c;模型有 3.6B元素 远多于世界上所有猫和狗总数(900M狗&#xff0c;600M猫) …

目标识别与双目测距(1)环境搭建:Ubuntu+yolov5+pcl库

环境情况 ubuntu 18.04 → 20.04&#xff08;最终&#xff09; 安装Ubuntu1804虚拟机系统 Anaconda&#xff1a;可参考我的另一篇文章 Python 3.6.13 → 3.8&#xff08;最终&#xff09;Anaconda3-2021.05 目标识别&#xff1a;YOLOv5相关 1、安装git sudo apt install gi…

LinuxTCP/UDP基础概念

TCP&#xff08;传输控制协议&#xff09; TCP 是一种面向连接的、可靠的、基于字节流的传输层通信协议。它的主要特点包括&#xff1a; 面向连接&#xff1a;在传输数据之前&#xff0c;需要通过“三次握手”建立连接&#xff1b;传输结束后&#xff0c;通过“四次挥手”断开…

人工智能通识速览一(神经网络)(编辑中)

上篇&#xff1a;人工智能通识速览一&#xff08;机器学习&#xff09; 人工智能通识速览一&#xff08;机器学习&#xff09;&#xff08;编辑中&#xff09;-CSDN博客https://blog.csdn.net/siper12138/article/details/146512068?sharetypeblogdetail&sharerId1465120…

【数据标准】数据标准化框架体系-基础类数据标准

导读&#xff1a;数据标准化的四大基础类标准&#xff08;业务术语、业务规则、命名规范、代码标准&#xff09;是企业数据治理的核心支柱。主要作用体现在​消除业务与技术间的语义鸿沟​&#xff08;通过统一术语与命名规范&#xff09;&#xff0c;​保障数据全生命周期的质…

可发1区的超级创新思路(python\matlab实现):MPTS+Lconv+注意力集成机制的Transformer时间序列模型

首先声明,该模型为原创!原创!原创!且该思路还未有成果发表,感兴趣的小伙伴可以借鉴! 应用场景 该模型主要用于时间序列数据预测问题,包含功率预测、电池寿命预测、电机故障检测等等。 一、模型整体架构(本文以光伏功率预测为例) 本模型由多尺度特征提取模块(MPTS)…

红宝书第二十一讲:详解JavaScript的模块化(CommonJS与ES Modules)

红宝书第二十一讲&#xff1a;详解JavaScript的模块化&#xff08;CommonJS与ES Modules&#xff09; 资料取自《JavaScript高级程序设计&#xff08;第5版&#xff09;》。 查看总目录&#xff1a;红宝书学习大纲 一、模块化的意义&#xff1a;分而治之 模块化解决代码依赖混…

非手性分子发光有妙招:借液晶之力,实现高不对称圆偏振发光

*本文只做阅读笔记分享* 一、圆偏振发光研究背景与挑战 圆偏振发光&#xff08;CPL&#xff09;材料在3D显示、光电器件等领域大有用处&#xff0c;衡量它的一个重要指标是不对称发光因子&#xff08;glum&#xff09;。早期CPL材料的glum值低&#xff0c;限制了实际应用。为…

MySQL数据库精研之旅第五期:CRUD的趣味探索(上)

专栏&#xff1a;MySQL数据库成长记 个人主页&#xff1a;手握风云 目录 一、CRUD简介 二、Create新增 2.1. 语法 2.2. 示例 三、Retrieve检索 3.1. 语法 3.2. 示例 一、CRUD简介 CURD是对数据库中的记录进行基本的增删改查操作&#xff1a;Create(创建)、Retrieve(检索…

【银河麒麟系统常识】需求:安装.NET SDK

前提 网络状态正常(非离线安装)&#xff1b; 终端命令如下所示 根据不同系统的版本&#xff0c;自行选择&#xff0c;逐行执行即可&#xff1b; # 基于 Ubuntu/Debian 的银河麒麟系统 wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O…

行业智能体大爆发,分布式智能云有解

Manus的一夜爆红&#xff0c;在全球范围内引爆关于AI智能体的讨论。 与过去一般的AI助手不同&#xff0c;智能体&#xff08;AI Agent&#xff09;并非只是被动响应&#xff0c;而是主动感知、决策并执行的应用。Gartner预测&#xff0c;到2028年&#xff0c;15%的日常工作决策…

工作记录 2017-03-13

工作记录 2017-03-13 序号 工作 相关人员 1 修改邮件上的问题。 开始处理操作日志部分。 测试了C#和MySql的连接。 更新RD服务器。 郝 更新的问题 1、 修改了CMS1500的打印&#xff0c;NDC的内容用了小的字体。 2、在Cliams List中可以查看Job的Notes。 3、Payment Po…

Codeforces Round 1014 (Div. 2)(A-D)

题目链接&#xff1a;Dashboard - Codeforces Round 1014 (Div. 2) - Codeforces A. Kamilka and the Sheep 思路 最大值-最小值 代码 void solve(){int n;cin>>n;vi a(n10);int mx0;int miinf;for(int i1;i<n;i){cin>>a[i];mimin(mi,a[i]);mxmax(mx,a[i])…

[操作系统,学习记录]3.进程(2)

1.fork(); 玩法一&#xff1a;通过返回值if&#xff0c;else去执行不同的代码片段 玩法二&#xff1a;if&#xff0c;else然后调用execve函数去执行新的程序 2.进程终止&#xff1a; 退出码&#xff0c;子进程通过exit/return返回&#xff0c;父进程wait/waitpid等待而得&am…

Masked Attention 在 LLM 训练中的作用与原理

在大语言模型&#xff08;LLM&#xff09;训练过程中&#xff0c;Masked Attention&#xff08;掩码注意力&#xff09; 是一个关键机制&#xff0c;它决定了 模型如何在训练时只利用过去的信息&#xff0c;而不会看到未来的 token。这篇文章将帮助你理解 Masked Attention 的作…