春招学习第11-12天(12/30)
昨日计划:
- 毕设增添新内容。√
- 学习SpringBoot自动装配原理及之后内容。X
今日计划:
- 完整学习SpringBoot自动装配原理及之后内容。√
- 多线程复习,以及JUC高并发初探 X
- 查看简历进度,如有面试则顺带复习面试相关。(收到4399笔试邀请,明天卓望数码宣讲会)
额外计划:
花了点时间整理了一下自己的收藏夹。效果如下
也算是决心安心学习了。那些能让我分心的网站只要我看不到,我就不会点进去
Spring Boot自动装配原理
上午看了看视频,再按照自己的理解写了一下。如果有不对的地方,还希望各位大佬帮忙指点,小弟感激不尽
Spring Boot启动类上的注解@SpringBootApplication
我们的主启动类中并没有对参数进行任何设置,然而框架却可以帮我们进行自动装配。原理就在于@SpringBootApplication
这一个注解
点开这个注解发现。7个注解,其中4个元注解,3个重要注解。
分别是@SpringBootConfiguration
、@EnableAutoConfiguration
、@ComponentScan
@SpringBootConfiguration
点进注解查看。
发现@SpringBootConfiguration其实是一个@Configuration
点进@Configuration最终发现是一个@Component组件。
@Configuration表示这是一个配置类。会交给容器进行处理。
@ComponentScan
组件扫描。用于扫描当前目录下的组件。这也正是我之前为什么将包放在主启动类外层目录不能被扫描到的原因
@EnableAutoConfiguration
剩下这个就是重点了。点进去看看里面有什么
@AutoConfigurationPackage 顾名思义,自动配置包。
自动配置包里面的注解是这样的
@Import可以帮我们导入另一个类。
Registrar.class。里面有两个方法
第一个用于注册BEAN的定义,第二个…暂时没有研究。
@Import({AutoConfigurationImportSelector.class}) 导入 自动配置解压选择器
这个就是自动装配的重点所在了。
@Import({AutoConfigurationImportSelector.class})
点进这个类里面。
可以看到它并没有注解(套娃结束),但存在许多方法。第一个就是我们要查看的重点。
方法顾名思义,查找需要导入的配置。
点入方法 getAutoConfigurationEntry(AnnotationMetadata annotationMetadata)
可以看到有一行关键性的代码:
List<string> configurations -> 所有的配置都来源于这里。于是我们再次点进getCandidateConfiguration()这个方法。</string>
只有两行代码。我们再次点入loadFactoryNames()
终于找到了一行return,似乎终于找到了一切的源头。
再次点进loadSpringFactories()方法
终于是有了点眉目。Spring Boot会将META-INF/spring.factories下的资源包导入。
于是我们找到autoconfigure包
点进去发现
似乎在这里找到了所有需要自动装配的包。
不过也并不是所有包都被装配进Spring Boot中。
随便点入一个包中,例如第四行的RabbitAutoConfiguration
同样包含许多注解,能让这些Bean开启的关键就是注解@Conditional
这些注解可以决定一个Bean能否被注入到容器中。
贴一下其他人总结的图
即,这些所有的BEAN都是有条件的注入到容器中,而不是全部注入。并且,他们会自动帮我们配置相关属性,即便我们没有写,也会帮我们写好。
其中@ConditionalOnProperty注解,我们就可以在application.yaml中配置,Spring Boot会帮我们配置解析到相应的容器中。
Spring Boot自动装配原理总结
Spring Boot会在启动时帮我们加载所有候选的autoConfigurations,但会在后续的运行中依照@Conditional系列注解选择不加载某些Bean到容器中,从而完成Bean的自动装配。
今日总结:
虽然有点打游戏怠惰了。但起码学了点自动装配原理,同时也收到了4399简历过邀请笔试的请求,算是过了第一关吧。明天有卓望数码的宣讲会,虽然网申了,但还是有必要过去听听。
明日计划:
- 复习多线程,开篇JUC
- 参加卓望数码宣讲会
本来是有其他计划的,但是看了看自己每天都把当天部分计划推到第二天,就是一个无底洞,说到底还是我不配啊。