我们挨个分析。

[](

)@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高级程序员面试笔记宝典相关推荐

  1. P8架构师:看源码是Java高级程序员的必经之路

    今天笔者在这里给大家介绍一下程序员的内功,内功修炼的内容就与之前文章中的技术内容大致相似,但是,那些技术不是说你想学就能学会的,如果你只是写了几年的业务代码,不对源码加以分析,那么你永远只是停留在码农 ...

  2. Java高级程序员面试经历

    我80年出生,05年毕业到现在已经快12年了,如果一直在技术上辛勤耕耘,足够的努力,加上多年的技术经验累积,这个年纪混到架构师级.技术总监甚至CTO还是有可能的.不过因为我自己的经历有点特别,2011 ...

  3. SpringBoot自动装配源码解析

    Spring Boot 自动装配原理 使用Spring Boot最方便的一点体验在于我们可以几零配置的搭建一个Spring Web项目,那么他是怎么做到不通过配置来对Bean完成注入的呢.这就要归功于 ...

  4. 全网首发!Java高级程序员面试集合

    前言 你的努力,终将成就无可替代的自己 本科毕业后就一直从事Java开发的工作,和多数人一样,最开始从事crud的工作,看着自己的同学一步一步往上走,自己还是在原地踏步,说实话这不是自己想要的状态. ...

  5. Java堆转储Dump文件的几种方法,java高级程序员面试笔试

    jmap -dump:live,format=b,file=/tmp/dump.hprof 12587 我们可以通过使用jps命令轻松获得Java进程的pid. 请记住,jmap是作为实验工具引入JD ...

  6. 老师讲的真棒!Java高级程序员面试集合,你还看不懂吗?

    前言: 首先介绍一下我的同学,专科毕业应用电子技术专业,已经毕业快两年了.因为专业的原因工作一年觉得没什么发展前途就想转行,身为他的"好基友",他觉得我这个工作挺好的,就咨询了我一 ...

  7. 8145v5 参数_SpringBoot外化配置源码解析:外化配置简介、参数处理|value|spring|调用|参数值

    SpringBoot外化配置源码解析 在前面章节我们讲解了 Spring Boot 的运作核心原理及启动过程中进行的一系列核心操作. 从本章开始,我们将针对在实践过程中应用的不同知识点的源代码进行解读 ...

  8. Springboot自动装配源码分析

    Springboot自动装配源码分析 1.从@SpringbootApplication点进去 2.可以看到核心的三个注解 @SpringbootConfiguration @EnableAutoCo ...

  9. 为什么3年的Java高级程序员薪水仅仅8k-10k,而一个Linux底层C语言程序员两年经验就敢要1...

    为什么80%的码农都做不了架构师?>>>    为什么3年的Java高级程序员薪水仅仅8k-10k,而一个Linux底层C语言程序员两年经验就敢要10k的薪水?   由于目前国内嵌入 ...

最新文章

  1. 在ASP.NET Core MVC中构建简单 Web Api
  2. MVC 3.0 在各个版本IIS中的部署
  3. C语言:L1-035 情人节 (15分)(解题报告)
  4. 图解HashMap(一)
  5. 添加到package_pycharm里面添加镜像库
  6. 备受期待的Python深度学习来了
  7. Android RTC 自下往上浅析
  8. xmapp 查询文字内容显示乱码
  9. php判断ipv6是否在范围内,[PHP] IPv6檢查IP是否在某個網段內 mtachcidr6
  10. mysql-5.6.24-win32.zip 下载 安装 配置 创建数据库
  11. MyBatis框架及原理分析
  12. vasp 模拟退火_vasp的分子动力学模拟
  13. 通过Python将不同的附件发给不同的收件人
  14. 苹果手机的计算机怎么设置快捷键大全,苹果Macbook快捷键使用大全,超详细!...
  15. css字体加粗_CSS字体
  16. 低功耗服务器cpu性能排行,电脑CPU天梯图性能排行榜 CPU性能天梯图2018年6月最新版...
  17. 计算机专业毕业设计选题与方向走势
  18. 360校招笔试算法题
  19. 上下协同,用友IPD的研发管理之道(下)
  20. 转换TIFF图像为JPEG2000格式

热门文章

  1. 明景视频侦查技术实验室-解决方案
  2. Fdog系列(二):html写完注册页面之后怎么办,用java写后台响应呀。
  3. 直播星引爆09最火行业,受益公司列表
  4. HTML5入门(ajax网络数据请求)
  5. Racing Game Starter Kit 1.1.0a
  6. 【Java编程系列】gateway限流实践时发生的问题和解决方案
  7. css3音乐播放器,CSS3 简约的音乐播放器
  8. 存储相关概要–BigTable设计原理
  9. 40 多条令人爆笑的编程注释
  10. ANSYS——如何选择合适的单元类型