前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >图解源码 | SpringBoot中自动配置原理

图解源码 | SpringBoot中自动配置原理

作者头像
Java技术江湖
发布2019-09-25 15:32:07
5800
发布2019-09-25 15:32:07
举报
文章被收录于专栏:微信公众号【Java技术江湖】

作者:肥朝

文章来源:肥朝

前言

最近一些朋友问到,之前的Dubbo源码系列还会不会更新.答案是,后续会升级"Dubbo源码解析系列-plus"版本.不要问我这个plus有多大,暂时还不会大到一只手无法掌控.

除了"源码解析"和"源码实战"外,今年的重点专题,也就是图解源码的快餐式专题.之前也发过一篇[图解源码 | MyBatis的Mapper原理]

如果要入门看源码,我认为最合适的就是MybatisSpringBoot,理由如下:

  1. 热门.你和他们相处的时间甚至比和你女朋友相处的时间要长
  2. 主流程复杂度不大.猜透这两个框架的原理和设计思路比猜对女孩子的心思简直简单太多了!
  3. 面试要问.像if else这种"坦诚相待"的代码面试根本没人问,相反像SpringBoot这样做了大量自动配置的"犹抱琵琶半遮面"的设计面试总是一上来就要把原理扒个精光.

直入主题

说到SpringBoot,最先想到的往往是做了大量的自动配置.常见的自动配置有两种方式

1.@EnableXXX

比如@EnableCaching

代码语言:javascript
复制
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
//导入指定配置类
@Import(CachingConfigurationSelector.class)
public @interface EnableCaching {
    //...省略
}

这种的好处是,当你依赖某个starter时,可以选择是否开启starter中帮你自动配置的一些设置.这个@EnableXXX从单词上看,就知道有开关的意思

2.META-INF/spring.factories

比如SpringBoot中默认的spring.factories

代码语言:javascript
复制
# 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是干嘛的了

代码语言:javascript
复制
//自定义逻辑返回需要导入的组件
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中,从而创建了自动配置类,根据自动配置类中的逻辑,进行相应的自动配置

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-03-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java技术江湖 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 直入主题
  • 图解源码
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档