SpringBoot-自动配置-源码解析,Java高级程序员面试笔记宝典
我们挨个分析。
[](
)@SpringBootConfiguration
点进去我们发现,它就是一个Configuration
@Configuration@Indexedpublic @interface SpringBootConfiguration {@AliasFor(annotation = Configuration.class)boolean proxyBeanMethods() default true;}
Spring中我们已经学过这个注解了,他代表当前是一个配置类,所以,在 SpringBootApplicaton
中标注的@SpringBootConfiguration
注解的作用就是标注此启动类是一个配置类。
[](
)@ComponentScan
从之前的Spring中我们也知道,这个注解表示IoC容器在进行注册的时候,从此注解中指定的方式进行包扫描,也不用过多纠结。
[](
)@EnableAutoConfiguration
@AutoConfigurationPackage // 通过主程序的所在的包名进行批量注册@Import(AutoConfigurationImportSelector.class) //public @interface EnableAutoConfiguration {String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";Class<?>[] exclude() default {};String[] excludeName() default {};}
这个注解主要由两个注解组成。我们一一分析
[](
)@AutoConfigurationPackage
:自动配置包
```@Import(AutoConfigurationPackages.Registrar.class) //通过主程序的所在的包名进行批量注册public @interface AutoConfigurationPackage {String[] basePackages() default {};Class<?>[] basePackageClasses() default {};} ```我们发现,这个注解通过`@Import(AutoConfigurationPackages.Registrar.class)`给IoC容器中导入了一个组件`AutoConfigurationPackages.Registrar`我们点进去发现,这是由连个方法组成的类,如下所示```static class Registrar implements ImportBeanDefinitionRegistrar, DeterminableImports {@Overridepublic void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {register(registry, new PackageImports(metadata).getPackageNames().toArray(new String[0]));}@Overridepublic Set<Object> determineImports(AnnotationMetadata metadata) {return Collections.singleton(new PackageImports(metadata));}} ```我们将断点打到此处,然后进行Debug进行分析。我们发现,这个方法给容器中导入了一系列的组件通过Debug发现,`metadata`参数代表的是最原始的那个`SpringBootApplication`启动类![image-20210725205925975](https://img-blog.csdnimg.cn/img_convert/8791893b693b61d14d919583a84bdb51.png)通过代码我们看到,它new了一个PackageImports对象,将启动类传进去,然后调用了getPackageNames()方法得到了一个包名,debug发现,返回的包名就是我们自己项目中的包名`cn.shaoxiongdu`,然后我们发现它将这个包名封装到了String数组中作为参数,调用了`register`方法。所以`register`这个方法就是通过包名,进行组件的批量注册,也就是主程序类所在的包。所以这就是为什么默认的包扫描规则是主程序类所在的包。所以注解`EnableAutoConfiguration`的第一部分,`AutoConfigurationPackage`的作用就是通过主程序的所在的包名进行批量注册,我们接下来看第二个注解。
[](
)@Import(AutoConfigurationImportSelector.class)
我们发现,这是一个类,点进去,发现了主要的方法如下```@Overridepublic String[] selectImports(AnnotationMetadata annotationMetadata) {if (!isEnabled(annotationMetadata)) {return NO_IMPORTS;}AutoConfigurationEntry autoConfigurationEntry = getAutoConfigurationEntry(annotationMetadata);return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());} ```通过方法名称发现这个方法返回了我们需要给容器中注册的bean名称的数组。那么我们的重点就在这里。```AutoConfigurationEntry autoConfigurationEntry = getAutoConfigurationEntry(annotationMetadata); //我们需要给容器中注册的bean名称的数组 ```点进去这个方法,我们继续分析这个方法。```protected AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) {if (!isEnabled(annotationMetadata)) {return EMPTY_ENTRY;}AnnotationAttributes attributes = getAttributes(annotationMetadata);List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes); // 获取所有的需要注册的候选组件configurations = removeDuplicates(configurations); // 移除重复的组件Set<String> exclusions = getExclusions(annotationMetadata, attributes);checkExcludedClasses(configurations, exclusions);configurations.removeAll(exclusions);configurations = getConfigurationClassFilter().filter(configurations);fireAutoConfigurationImportEvents(configurations, exclusions);return new AutoConfigurationEntry(configurations, exclusions);} ```通过Debug我们发现,执行到了第7行的时候`configurations`这个List中已经有了一百多个bean的名称,之后的操作就是对List集合进行一些常规处理并返回。![image-20210725212042406](https://img-blog.csdnimg.cn/img_convert/ad35f69b13c11cd8fdf0cbb97fdac7a8.png)所以我们只需要分析第6行这个方法`getCandidateConfigurations(annotationMetadata, attributes);`是它返回了我们需要给容器中默认注册的bean的名称的字符数组。我们重新Debug,进入方法```protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {List<String> configurations = SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(),getBeanClassLoader()); // 获取需要注册的组件集合Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you "+ "are using a custom packaging, make sure that file is correct.");return configurations;}
总结
谈到面试,其实说白了就是刷题刷题刷题,天天作死的刷。。。。。
为了准备这个“金三银四”的春招,狂刷一个月的题,狂补超多的漏洞知识,像这次美团面试问的算法、数据库、Redis、设计模式等这些题目都是我刷到过的
**[CodeChina开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频】](
)**
并且我也将自己刷的题全部整理成了PDF或者Word文档(含详细答案解析)
66个Java面试知识点
架构专题(MySQL,Java,Redis,线程,并发,设计模式,Nginx,Linux,框架,微服务等)+大厂面试题详解(百度,阿里,腾讯,华为,迅雷,网易,中兴,北京中软等)
算法刷题(PDF)
是我刷到过的
**[CodeChina开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频】](
)**
并且我也将自己刷的题全部整理成了PDF或者Word文档(含详细答案解析)
[外链图片转存中…(img-QOyUYF27-1631182464749)]
66个Java面试知识点
架构专题(MySQL,Java,Redis,线程,并发,设计模式,Nginx,Linux,框架,微服务等)+大厂面试题详解(百度,阿里,腾讯,华为,迅雷,网易,中兴,北京中软等)
[外链图片转存中…(img-jI4AsrCy-1631182464750)]
算法刷题(PDF)
SpringBoot-自动配置-源码解析,Java高级程序员面试笔记宝典相关推荐
- P8架构师:看源码是Java高级程序员的必经之路
今天笔者在这里给大家介绍一下程序员的内功,内功修炼的内容就与之前文章中的技术内容大致相似,但是,那些技术不是说你想学就能学会的,如果你只是写了几年的业务代码,不对源码加以分析,那么你永远只是停留在码农 ...
- Java高级程序员面试经历
我80年出生,05年毕业到现在已经快12年了,如果一直在技术上辛勤耕耘,足够的努力,加上多年的技术经验累积,这个年纪混到架构师级.技术总监甚至CTO还是有可能的.不过因为我自己的经历有点特别,2011 ...
- SpringBoot自动装配源码解析
Spring Boot 自动装配原理 使用Spring Boot最方便的一点体验在于我们可以几零配置的搭建一个Spring Web项目,那么他是怎么做到不通过配置来对Bean完成注入的呢.这就要归功于 ...
- 全网首发!Java高级程序员面试集合
前言 你的努力,终将成就无可替代的自己 本科毕业后就一直从事Java开发的工作,和多数人一样,最开始从事crud的工作,看着自己的同学一步一步往上走,自己还是在原地踏步,说实话这不是自己想要的状态. ...
- Java堆转储Dump文件的几种方法,java高级程序员面试笔试
jmap -dump:live,format=b,file=/tmp/dump.hprof 12587 我们可以通过使用jps命令轻松获得Java进程的pid. 请记住,jmap是作为实验工具引入JD ...
- 老师讲的真棒!Java高级程序员面试集合,你还看不懂吗?
前言: 首先介绍一下我的同学,专科毕业应用电子技术专业,已经毕业快两年了.因为专业的原因工作一年觉得没什么发展前途就想转行,身为他的"好基友",他觉得我这个工作挺好的,就咨询了我一 ...
- 8145v5 参数_SpringBoot外化配置源码解析:外化配置简介、参数处理|value|spring|调用|参数值
SpringBoot外化配置源码解析 在前面章节我们讲解了 Spring Boot 的运作核心原理及启动过程中进行的一系列核心操作. 从本章开始,我们将针对在实践过程中应用的不同知识点的源代码进行解读 ...
- Springboot自动装配源码分析
Springboot自动装配源码分析 1.从@SpringbootApplication点进去 2.可以看到核心的三个注解 @SpringbootConfiguration @EnableAutoCo ...
- 为什么3年的Java高级程序员薪水仅仅8k-10k,而一个Linux底层C语言程序员两年经验就敢要1...
为什么80%的码农都做不了架构师?>>> 为什么3年的Java高级程序员薪水仅仅8k-10k,而一个Linux底层C语言程序员两年经验就敢要10k的薪水? 由于目前国内嵌入 ...
最新文章
- 在ASP.NET Core MVC中构建简单 Web Api
- MVC 3.0 在各个版本IIS中的部署
- C语言:L1-035 情人节 (15分)(解题报告)
- 图解HashMap(一)
- 添加到package_pycharm里面添加镜像库
- 备受期待的Python深度学习来了
- Android RTC 自下往上浅析
- xmapp 查询文字内容显示乱码
- php判断ipv6是否在范围内,[PHP] IPv6檢查IP是否在某個網段內 mtachcidr6
- mysql-5.6.24-win32.zip 下载 安装 配置 创建数据库
- MyBatis框架及原理分析
- vasp 模拟退火_vasp的分子动力学模拟
- 通过Python将不同的附件发给不同的收件人
- 苹果手机的计算机怎么设置快捷键大全,苹果Macbook快捷键使用大全,超详细!...
- css字体加粗_CSS字体
- 低功耗服务器cpu性能排行,电脑CPU天梯图性能排行榜 CPU性能天梯图2018年6月最新版...
- 计算机专业毕业设计选题与方向走势
- 360校招笔试算法题
- 上下协同,用友IPD的研发管理之道(下)
- 转换TIFF图像为JPEG2000格式