博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SpringBoot实现自动配置(图解超详细)
阅读量:3897 次
发布时间:2019-05-23

本文共 1800 字,大约阅读时间需要 6 分钟。

这篇博客参考自 JavaGuide的公众号,详细信息可以去关注他的公众号来查看

前提背景:

首先我们需要知道的是,对于Spring-Boot项目,只需要添加相关依赖,无需配置,通过启动main方法就行,并且可以对全局变量文件application.properties或application.yml即可对项目进行设置,比如更换端口号,配置jpa属性等等

其次,要知道SpringBoot定义了一套接口规范:SpringBoot在启动的时候会扫描外部引用jar包中的META-INF/spring.factories文件,将文件中的配置类型信息加载到Spring容器,并执行类定义中的各项操作,所以对于外部的jar来说,只需要安装spring定义的标准,就能把自己的功能装置到springBoot中。

正文

随便创建一个Spring-Boot项目
1.核心注释SpringBootApplication
在这里插入图片描述
可以把@SpringBootApplication看作是@SpringBootConfiguration,@EnableAutoConfiguration和
@ComponentScan这个三个注解的集合,而其中这三个注解的作用分别是:

@SpringBootConfiguration:允许在上下文中注册额外的bean或者导入其他配置项

@EnableAutoConfiguration 启动SpringBooot的自动配置机制 @ComponentScan
扫描被@Compent(@Service
@Controller)注解的bean,注解是会默认扫描启动类所在的包下的所有的类,也可以自定义不扫描一些bean

所以会发现是@EnableAutoConfiguration这个注解的功劳

2.@EnableAutoConfiguration

去看这个代码
在这里插入图片描述
会发现它只是一个简单的注解,自动装配核心功能的实现实际上是通过AutoConfigurationImportSelector来实现的,所以再看一下这个类
3.AutoConfigurationImportSelector类
再根据
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
锁定到了最后一个,也就是说AutoConfigurationImportSelector类是实现了ImportSelector接口,也实现了接口中的selectImports方法,这个方法的作用就是:获取所有的符合条件的全限定类名,这些类需要被加载到IOC容器当中
在这里插入图片描述
在关注一下getAutoConfigurationEntry这个方法,这个方法是主要负责加载自动配置类的。
这个是调用链
在这里插入图片描述
对应源码如下:
在这里插入图片描述
设置记号进行debug
第一步:到isEnabled这个函数
在这里插入图片描述
先判断自动装配的开关是否打开,发现EnableAutoConfiguration默认是true的,这个是可以再application.properties或application.yml中设置
第二步就是,获取EnableAutoConfiguration中的exclude和excludeName
在这里插入图片描述
第三步就是获取需要自动装配的所有配置类,读取META-INF/spring.factories
在这里插入图片描述
这个可以和Maven那边的org.springframework.boot:spring-boot_autoconfiguration那边对比一下
从下图可以看到是都被读取到的,所以这个的作用就是按需加载组件
在这里插入图片描述
而且不光是这个依赖下的META-INF/spring.factories被读取到,所有 Spring Boot Starter 下的META-INF/spring.factories都会被读取到

并且,由于这里的明显变小可以知道(调用了这个方法getConfigurationClassFilter)

在这里插入图片描述
经过这一步的筛选,那些满足条件的类才会生效

总的来说就是

Spring Boot 通过@EnableAutoConfiguration开启自动装配,通过 SpringFactoriesLoader 最终加载META-INF/spring.factories中的自动配置类实现自动装配,自动配置类其实就是通过@Conditional按需加载的配置类,想要其生效必须引入spring-boot-starter-xxx包实现起步依赖

转载地址:http://bsfen.baihongyu.com/

你可能感兴趣的文章
WebKit之Http请求
查看>>
WebKit之FrameWork层介绍
查看>>
WebKit之Http响应
查看>>
Webkit之支持WML
查看>>
Webkit之HTMLInput分析
查看>>
WebKit之UserAgent分析
查看>>
Webkit之HTMLToken处理
查看>>
Webkit之HTMLTokenizer分析
查看>>
Webkit之平台相关层
查看>>
Webkit之UI层布局
查看>>
WebKit之InlineBox绘制阶段顺序
查看>>
WebKit之图像显示分析流程
查看>>
WebKit之addToJavaScriptWindowObject()分析
查看>>
资源之收集列表整理
查看>>
JS之kindeditor的用法简介
查看>>
Linux之最简字符驱动的编码模型
查看>>
服务之Windows平台上搭建SVN服务
查看>>
Python之封装diff命令的项目比较命令(格式化diff输出结果)
查看>>
Shell之定时拉起脚本
查看>>
Shell之导出数据库的表为Excel的脚本
查看>>