转载

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

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

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

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

热门
主流程复杂度不大
面试要问
图解源码 | 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 了,更多的时候是想要你完成全套操作.那么我们就来讲讲,这个自动配置是怎么做的

图解源码

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

简单文字解说:

首先要知识普遍一下,比如我图中红色框起来的是什么意思呢?那么首先你就要了解 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
正文到此结束
Loading...