SpringBoot自动装配原理

SpringBoot自动装配原理
要先了解SpringBoot自动装配原理我们就得了解@SpringBootApplication注解,他是由三个注解组合成的也就是@ComponentScan(扫描包)和@SpringBootConfiguration(本质就是@Configuration,扫描配置的注解)以及最重要的@EnableAutoConfiguration(自动装配注解)

@ComponentScan


 

其实也就是Spring的扫描注解,使得@SpringBootApplication实现了自动扫描父包和子包,这样使得我们的APP启动类要放在项目包下面,当然我们放在其他地方也可以,但是需要自己配置扫描路径,

我们以前需要配置包扫描器<context:component-scan base-package="com.test"/>.

@ComponentScan("com.test") 扫描包。
@SpringBootConfiguration


 

其实SpringBootConfiguration也就是@Configuration注解,他就是javaConfig形式的Spring Ioc容器的配置类使用的@Configuration,本身其实也是一个Ioc容器,以前是使用xml配置的,现在简化开发使用的Bean的来源。

@EnableAutoConfiguration


 

@EnableAutoConfiguration是一个复合注解,它其中最关键的注解便是@Import(EnableAutoConfigurationImportSelector.class)和@AutoConfigurationPackage

@AutoConfigurationPackage 里面其实是@Import(Registrar.class)里面存放的其实是包扫描器传过来的,也就是自动注册表。

@Import(EnableAutoConfigurationImportSelector.class)就比较重要了,它一路走下去就是加载了所有在META-INF下面的spring.factories中的自动装配对象,前提是我们导入了对应的启动类。也就是帮助了SpringBoot引用所有符合条件的@Configuration配置到当前SpringBoot所创建的Ioc容器中,就像一个八爪鱼一样借助于Spring原框架的一个工具类:SpringFactoriesLoader。这才使得@EnableAutoConfiguration自动装配的功能实现。



 

这个注解也是一个派生注解,主要的功能由@Import提供。@Import(AutoConfigurationImportSelector.class)

这是AutoConfigurationImportSelector的主要方法



 

它又调用了

AutoConfigurationEntry autoConfigurationEntry = getAutoConfigurationEntry(
      autoConfigurationMetadata, annotationMetadata);


 

List<String> configurations = getCandidateConfigurations(annotationMetadata,
      attributes);


 

configurations里面有120个东西就是我们的META-INF/spring.factories里面的jar包我们继续往下走看它是怎么得到的。



 

这时候我们看到

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


 

是不是很熟悉的方法loadFactoryNames这个方法扫描了了所有具有META-INF/spring.factories的jar包,

classLoader.getResources(FACTORIES_RESOURCE_LOCATION) :


 

@EnableAutoConfiguration通过@Import(AutoConfigurationImportSelector.class)调用AutoConfigurationImportSelector中的selectImports调用getAutoConfigurationEntry中的getCandidateConfigurations的SpringFactoriesLoader.loadFactoryNames方法中的

Enumeration<URL> urls = (classLoader != null ?
      classLoader.getResources(FACTORIES_RESOURCE_LOCATION) :
      ClassLoader.getSystemResources(FACTORIES_RESOURCE_LOCATION));
      
      public static final String FACTORIES_RESOURCE_LOCATION = "META-INF/spring.factories";
FACTORIES_RESOURCE_LOCATION中存的就是所有带的jar包。

而在spring.factories文件也是一组一组的k-v的形式,k就是EnableAutoConfiguration的全类名,v是xxxxAutoConfiguration的类名的列表,用逗号隔开



 

这个@EnableAutoConfiguration注解通过@SpringBootApplication被间接的标记在了Spring Boot的启动类上。在SpringApplication.run(…)的内部就会执行selectImports()方法,找到所有JavaConfig自动配置类的全限定名对应的class,然后将所有自动配置类加载到Spring容器中。

自动配置生效
每一个XxxxAutoConfiguration自动配置类都是在某些条件之下才会生效的,这些条件的限制在Spring Boot中以注解的形式体现,常见的条件注解有如下几项

@ConditionalOnBean:当容器里有指定的bean的条件下。 @ConditionalOnMissingBean:当容器里不存在指定bean的条件下。 @ConditionalOnClass:当类路径下有指定类的条件下。 @ConditionalOnMissingClass:当类路径下不存在指定类的条件下。

在ServletWebServerFactoryAutoConfiguration类上,有一个@EnableConfigurationProperties注解:开启配置属性,而它后面的参数是一个ServerProperties类,这就是习惯优于配置的最终落地点。



在这个类上有个ConfigurationProperties注解,他的作用就是从配置文件中绑定属性到对应的bean上,而@EnableConfigurationProperties负责导入已经绑定了属性的bean到Spring容器中,那么所有和他相关的属性都可以在全局配置文件中定义,限制全局配置文件中配置那些属性就是XxxxProperties类,他与配置文件中定义的prefix关键字开头的一组属性是唯一对应的。

全局配置文件中的属性通过@ConfigurationProperties注解绑定到对应的Properties配置实体类上封装为一个bean,再通过@EnableConfigurationProperties注解导入到Spring容器中。

而诸多的XxxxAutoConfiguration自动配置类,就是Spring容器的JavaConfig形式,作用就是为Spring 容器导入bean,而所有导入的bean所需要的属性都通过xxxxProperties的bean来获得。

面试解答

Spring Boot启动的时候会通过@EnableAutoConfiguration注解找到META-INF/spring.factories配置文件中的所有自动配置类,并对其进行加载,而这些自动配置类都是以AutoConfiguration结尾来命名的,它实际上就是一个JavaConfig形式的Spring容器配置类,它能通过以Properties结尾命名的类中取得在全局配置文件中配置的属性如:server.port,而XxxxProperties类是通过@ConfigurationProperties注解与全局配置文件中对应的属性进行绑定的。
当然不是所有的jar包我们都用的上,当我们导入了对应的启动器他才能供我们使用详情看这里



 

这些是条件注解,只有导入了启动类,条件注解检测到了有对应的类,这个类才会自动化配置。

最后奉上大图

 
————————————————
版权声明:本文为CSDN博主「本来写bug却写成了程序」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_57560984/article/details/120178077
#Java开发##Spring##学习路径#
全部评论
借楼发个招聘,富途,港美股互联网券商, 内推链接:富途校园招聘 (futunn.com),内推码:NTAFTD0 内推链接如下 手机版复制到微信打开(网页版可以直接打开) app.mokahr.com/recommendation-apply/futu5/1699?sharePageId=821019&recommendCode=NTAFTD0&codeType=1#/recommendation/page/821019
点赞 回复 分享
发布于 2021-10-01 17:15

相关推荐

距离第一次面试刚刚好过去一个月,总算是oc了,后面也不打算再找了,所以简单做个总结bg双九科班简历牛客论坛+黑马点评,有个挑战杯大模型相关比赛决赛一等奖无实习经历,LeetCode除hot100之外有额外刷一些,大概200左右,八股一般,主要背了redis相关大概4月初开始投,虽然bg让我有不少面试机会,但大多都是一面挂,只有阿里智能信息顺利oc,鹅的复活赛进了一次二面。总结失败经验:没有实习经验、项目烂大街加上最开始确实没有完全吃透,基本一深入问就g以下记录一下时间线:美团&nbsp;4.23&nbsp;一面挂阿里国际&nbsp;4.29&nbsp;一面挂腾讯&nbsp;5.8&nbsp;一面挂阿里云&nbsp;5.9&nbsp;一面挂腾讯复活赛一番战&nbsp;5.13&nbsp;一面&nbsp;5.20二面挂淘天&nbsp;5.14&nbsp;一面挂(阿里妈妈的压迫感太强了)腾讯音乐&nbsp;5.14&nbsp;一面挂阿里智能信息&nbsp;5.15一面&nbsp;5.20二面&nbsp;5.23HR面&nbsp;HR面后三小时oc其实还投了不少,饿了么笔试没后续,蚂蚁笔试没后续,OPPO笔试挂,虾皮笔试挂,阿里控股、京东还在池子里,很早就投的顺丰发了个面试时间意向邮件后无后续以下是面经:美团、阿里国际、阿里智能信息已单独发腾讯一面:讲讲session和cookie,了不了解单点登录csrf攻击布隆过滤器讲讲cas讲讲redis里的数据结构,跳表有了解吗热帖排行功能展开讲讲讲讲你项目里的分布式锁acid、隔离级别,mysql默认是哪个级别,为什么ioc和aop手撕:连续子数组的最大和其实这次面试体验还挺好,就是单点登录问题面试官前面暗示了很多次,最后直截了当问了,但我这块当时确实没准备到淘天一面:除了maven还有什么管理第三方包;如何处理maven依赖冲突AC自动机了解吗布隆过滤器threadlocal,如何跨线程传递值mysql的锁了解吗,什么情况下会产生死锁商品数量多时如何考虑分库分表redisson自动续锁怎么解决死锁问题get和post的区别;为什么get中带url是不安全的循环依赖是什么,spring中如何解决,适用于什么情况ioc、aop讲讲为什么要做这两个项目csrf手撕快排,讲原理被拷打最狠的一集,阿里妈妈不愧是阿里妈妈,是我完全高攀不起了腾讯复活赛一番战一面:static的作用final和finally的区别==和equals的区别为什么有了equals还需要hashcode为什么重写&nbsp;equals()&nbsp;时必须重写&nbsp;hashCode()&nbsp;方法?ioc和aopredis有哪些部署架构讲讲redisson对分布式锁的优化,什么情况下只使用单体redis手撕:删除有序链表中的重复值都是很基础的八股
点赞 评论 收藏
分享
注:本秘籍适用于计算机、人工智能、电子信息等相关专业的应届生,目标是互联网大厂/知名科技公司的算法工程师岗位(如搜索推荐算法、CV、NLP、LLM等)。✅&nbsp;一、前期准备1.1&nbsp;岗位了解🔍&nbsp;算法岗位的分类-&nbsp;搜索推荐算法:常见于字节跳动、美团、阿里、京东等公司,负责商品/视频/资讯/音乐等的搜索推荐等,出名的部门如阿里妈妈、百度凤巢、快手社科线等。-&nbsp;CV/NLP算法:百度、腾讯、华为、商汤等偏AI方向的公司需求较多,对应的业务场景如视觉感知、目标检测、query理解、意图识别等,岗位要求CV比较卷,需要论文背书。-&nbsp;风控/金融算法:蚂蚁金服、平安科技、微众银行等金融科技类企业。-&nbsp;机器学习算法:业务场景广阔,如电商的搜索推荐、公司中台等。-&nbsp;大模型/AIGC/多模态算法:业务场景广泛,如智能客服机器人、文生图等,出名的部门如阿里通义实验室、字节豆包、快手可灵等,对实践的要求比较高,如参与过大模型预训练,SFT,RLHF等项目。🎯&nbsp;如何选择岗位-&nbsp;结合自己的研究方向或实习经历;-&nbsp;参考行业趋势(如AIGC、大模型、多模态等);-&nbsp;考虑公司发展路径和成长空间;-&nbsp;关注base地点、薪资结构、工作强度等实际因素。1.2&nbsp;简历准备📄&nbsp;简历要素-&nbsp;基本信息:姓名、联系方式、邮箱;-&nbsp;教育背景:学校、专业、学历、毕业时间;-&nbsp;项目经验(重点!):每个项目写清问题背景、解决方法、技术栈、结果(最好有量化指标),强调自己在其中的具体贡献,如“主导”、“设计”、“优化”等;-&nbsp;实习经历(如有):写清楚做了什么、用了什么技术、解决了什么问题;-&nbsp;技能项:编程语言如Python、C++、Java等,框架工具如PyTorch、TensorFlow、Sklearn、Hadoop、Spark等;-&nbsp;学术论文、竞赛名次(如Kaggle、天池等)。✨&nbsp;小贴士-&nbsp;控制在一页内,简洁明了;-&nbsp;使用PDF格式;-&nbsp;避免空洞描述,突出技术细节;-&nbsp;建议至少有一个比较垂直的项目(岗位匹配度高),可以再放一个自己学校科研的项目(如果有论文就更好了)。1.3&nbsp;刷题和八股💻&nbsp;刷题平台推荐-&nbsp;LeetCode(hot&nbsp;100,可参考代码随想录)-&nbsp;牛客网(国内题目更全,很多公司笔试的平台,需要熟悉ACM形式)📚&nbsp;刷题建议-&nbsp;先按类型刷(数组、链表、二叉树、动态规划、回溯、贪心、图论等)-&nbsp;中后期做周赛、双周赛模拟真实环境-&nbsp;掌握常见算法模板(DFS/BFS、二分查找、快排、TopK等)📝&nbsp;八股内容(基础知识)(见下图1)✅&nbsp;二、面试相关2.1&nbsp;面试风格⏱️&nbsp;面试形式一般是2到3轮技术面+1轮hr面,一般为视频面(也有电话面)。一般一面的面试官,是日后要加入团队的leader(+1);二面的面试官,是交叉团队的leader;三面的面试官,是主管(+2)。🧩&nbsp;面试流程自我介绍(1~2分钟),项目深挖(核心环节),八股拷打(理论知识),手撕代码题(共享屏幕),反问环节。2.2&nbsp;项目相关🧩&nbsp;面试官常问的问题这个项目的问题背景是什么?你想解决什么问题?你的解决方案的动机是什么?你是怎么设计模型的?有没有对比过不同模型?数据是怎么处理的?有没有做特征工程?模型效果如何?用什么指标衡量的?模型有上线吗?上线后发现效果不好有思考是什么原因吗?遇到哪些困难?你是怎么解决的?如果让你重新做一次,你会改进哪里,未来的升级迭代考虑哪些方面?✅&nbsp;应对策略项目讲清楚:背景&nbsp;→&nbsp;方法&nbsp;→&nbsp;实现&nbsp;→&nbsp;结果。技术细节要扎实:能讲清楚Loss函数设计、模型结构、输入数据的处理、衡量指标等。2.3&nbsp;八股相关🧾&nbsp;高频考点(分类整理)机器学习:-&nbsp;什么是过拟合?如何防止?-&nbsp;随机森林,GBDT&nbsp;和&nbsp;XGBoost&nbsp;的区别?-&nbsp;SVM原理?核函数的作用?-&nbsp;Bagging&nbsp;vs&nbsp;Boosting?深度学习:-&nbsp;Transformer结构?为什么比CNN/RNN好?-&nbsp;Dropout的作用?训练和测试阶段的区别?-&nbsp;BatchNorm的计算过程?优点?-&nbsp;BN和LN的区别以及Transformer为什么用LN?-&nbsp;Transformer里的Attention的理解,以及公式里为什么要除以&nbsp;$$\sqrt{d_k}$$?-&nbsp;梯度消失/爆炸的原因和解决方案?-&nbsp;介绍下Transformer的结构?大模型相关:-&nbsp;GPT和BERT的区别?-&nbsp;大模型应用的位置编码的方式有哪些?知道旋转位置编码(ROPE)吗?-&nbsp;大模型微调的方式有哪些?LoRA微调的原理及改进?-&nbsp;大模型用的强化学习的算法有哪些?比如RLHF,PPO,DPO,GRPO?-&nbsp;了解大模型的RAG,Agent吗?-&nbsp;知道模型训练和推理加速的方法吗?模型评估:-&nbsp;AUC的含义?如何计算?-&nbsp;Precision和Recall的区别?应用场景?-&nbsp;为什么不能只看准确率?工程相关:-&nbsp;如何进行特征工程?-&nbsp;做特征embedding的方式有哪些,以及适用的场景?-&nbsp;模型调参的方法有哪些?-&nbsp;分布式训练怎么做?2.4&nbsp;HR相关👥&nbsp;HR面常见问题-&nbsp;自我介绍(简短有力)-&nbsp;为什么选择我们公司?-&nbsp;你的优缺点是什么?-&nbsp;未来3年的发展规划?-&nbsp;你最大的挑战和收获?-&nbsp;你如何看待加班文化?-&nbsp;你有其他的Offer吗?-&nbsp;你愿意来某某base地工作吗?-&nbsp;你有女朋友/男朋友吗?✅&nbsp;回答技巧-&nbsp;真诚表达,不套路;-&nbsp;结合公司业务、技术氛围、成长机会来谈;-&nbsp;展示你的热情和长期意愿;-&nbsp;对加班文化可以表示理解并接受合理范围内的高强度工作。-&nbsp;展示自己的offer实力(如有),不卑不亢,有礼有节。-&nbsp;展示自己对base地满意的点,列举其好处。✅&nbsp;三、问题反问在面试最后,通常会有“你有什么想问我的吗?”这个环节,这是展示主动性和思考深度的好机会。3.1常见优质反问问题✅&nbsp;关于团队目前团队的技术栈主要是什么?团队目前的重点方向是什么?我将加入哪个项目组?主要负责什么模块?团队主要是偏重业务还是预研方向?团队的base地在哪里?✅&nbsp;关于成长公司对新人的成长支持有哪些?有无mentor制度?是否鼓励参加技术会议?✅&nbsp;关于业务该岗位的核心产出指标是什么?当前业务面临的最大挑战是什么?✅&nbsp;关于流程后续还有几轮面试?预计什么时候出结果?🎯&nbsp;总结:通关路线图(见下图2)📣&nbsp;最后一句话算法岗竞争激烈,但只要你足够努力、方法得当、心态稳定,offer终将属于你!祝各位纵有千古,横有八荒,前途似锦,来日方长!祝大家早日斩获心仪Offer!🎉
牛客刘北:mark总结得很全
我的求职总结
点赞 评论 收藏
分享
评论
5
26
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务