前言
最近一些朋友问到, 之前的 Dubbo 源码系列还会不会更新. 答案是, 后续会升级 "Dubbo 源码解析系列 - plus" 版本. 不要问我这个 plus 有多大, 暂时还不会大到一只手无法掌控.
除了之前的 "源码解析" 和 "源码实战" 外, 今年还会多一个专题, 也就是图解源码的快餐式专题. 之前发过一篇图解源码 | MyBatis 的 Mapper 原理 https://mp.weixin.qq.com/s/Ki1f_mkoOkPMQiGbJWu4Sw
如果要入门看源码, 我认为最合适的就是 Mybatis 和 SpringBoot, 理由如下:
热门. 你和他们相处的时间甚至比和你女朋友相处的时间要长
主流程复杂度不大. 猜透这两个框架的原理和设计思路比猜对女孩子的心思简直简单太多了!
面试要问. 像 if else 这种 "坦诚相待" 的代码面试根本没人问, 相反像 SpringBoot 这样做了大量自动配置的 "犹抱琵琶半遮面" 的设计面试总是一上来就要把原理扒个精光.
直入主题
说到 SpringBoot, 最先想到的往往是做了大量的自动配置. 常见的自动配置有两种方式
1.@EnableXXX
比如 @EnableCaching
- @Target(ElementType.TYPE)
- @Retention(RetentionPolicy.RUNTIME)
- @Documented
- // 导入指定配置类
- @Import(CachingConfigurationSelector.class)
- public @interface EnableCaching {
- //... 省略
- }
这种的好处是, 当你依赖某个 starter 时, 可以选择是否开启 starter 中帮你自动配置的一些设置. 这个 @EnableXXX 从单词上看, 就知道有开关的意思
2.META-INF/spring.factories
比如 SpringBoot 中默认的 spring.factories
- # Auto Configure
- org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
- org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
- org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
- org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
- org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\
- org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration,\
- // 省略
这种的好处是, 当你依赖某个 starter 时, 自动帮你开启 starter 中帮你自动配置的一些设置.
由于我在公司做的是基础架构这块, 所以这两种我都有用到, 当然第二种用得比较多, 因为人家都依赖你的 starter 了, 更多的时候是想要你完成全套操作. 那么我们就来讲讲, 这个自动配置是怎么做的
图解源码
简单文字解说:
首先要知识普遍一下, 比如我图中红色框起来的是什么意思呢? 那么首先你就要了解 ImportSelector 是干嘛的了
- // 自定义逻辑返回需要导入的组件
- public class MyImportSelector implements ImportSelector {
- /**
- * @param importingClassMetadata 当前标注 @Import 注解的类的所有注解信息
- * @return 导入到容器中的组件全类名
- */
- public String[] selectImports(AnnotationMetadata importingClassMetadata) {
- return new String[]{"com.toby.register.bean.Colour"};
- }
- }
说白了就是把组件的全类名给我, 我帮你初始化这个多个 bean. 和你在 spring 的 xml 中配置 bean, 是一个意思. 区别就在于, 这种方式能够在代码运行中配置创建 bean. 所以我们总结一下, 这个自动配置的原理究竟是怎么样的
1. 启动 main 函数, 加载 @SpringBootApplication
2.@SpringBootApplication 会拿到 META-INF/spring.factories 中需要自动配置的类的全名
3. 把自动配置的类全名放入 ImportSelector 中, 从而创建了自动配置类, 根据自动配置类中的逻辑, 进行相应的自动配置
写在最后
来源: https://juejin.im/post/5c7ea3545188255dce5dda6e