SpringBoot自动配置原理(SpringBoot面试题)-创新互联
目录
按需求定制制作可以根据自己的需求进行定制,做网站、网站建设构思过程中功能建设理应排到主要部位公司做网站、网站建设的运用实际效果公司网站制作网站建立与制做的实际意义1、产生疑惑
2、源码分析
2.1、pom.xml文件分析
2.2、启动类分析
3、总结
1、产生疑惑
当我们第一次使用Spring Boot练习的时候会觉得Spring Boot这么厉害,不管是依赖还是配置,它都为我们准备好了,我们只需要去编写业务代码就可以了,省去了配置的繁琐。那么Spring Boot之所以能够为我们提供这些操作,它是如何实现的呢?
2、源码分析 2.1、pom.xml文件分析我们打开创建Spring Boot项目后的pom.xml文件
可以看到这里有一个parent标签,这就父级工程spring-boot-starter-parent,这叫做Spring Boot的起步依赖,那么这个起步依赖有什么东西呢,我们使用ctrl+左键打开看看
可以看到这里面又继承于一个spring-boot-dependencies的依赖,这就是Spring Boot的核心依赖,我们继续打开
可以看到,这里面整合了大量的依赖和插件,以及各个依赖的版本,非常大的文件,整整3200多行,这就是Spring Boot的核心依赖库,之所以我们不用再去手动导依赖的原因,就是Spring Boot已经把大量我们能用到的整合到了这个库中,之所以我们不用再声明依赖的版本是因为,Spring Boot做了统一的版本控制,不同版本的Spring Boot,里面会有不同版本的依赖。这也是Spring Boot特点之一约定大于配置。
Spring Boot还有很多启动依赖,spring-boot-starter只是其中一个
org.springframework.boot spring-boot-starterorg.springframework.boot spring-boot-starter-web
2.2、启动类分析有了依赖的支持,那么Spring Boot是如何实现自动配置的呢?
这就需要我们去研究一下启动类中@SpringBootAppliation注解
我们ctrl+鼠标左键打开注解的源码
可以看到里面是一个自定义注解的形式
@Target(ElementType.Type) 返回可以应用于注释类型的元素类型的数组
@Retention(RetentionPolicy.RUNTIME) 指示被它注解的注解保留多久
注解 | 说明 |
---|---|
SOURCE | 注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃;被编译器忽略 |
CLASS | 注解被保留到class文件,但jvm加载class文件时候被遗弃,这是默认的生命周期 |
RUNTIME | 注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在 |
@Documented
指示带有类型的注释在默认情况下由javadoc和类似工具记录。该类型应用于注释类型的声明,这些类型的注释影响其客户端对注释元素的使用。
@Inherited
指示自动继承注释类型。
@SpringBootConfiguration (核心注解)
该注解作用:
1.标明本类是个配置类
2.扫描添加了@Configuration的配置类。
@EnableAutoConfiguration (最核心的注解) 开启自动配置
我们打开@Import注解里的AutoConfigurationImportSelector类
找到selectImports方法,里面调用了一个getAutoConfigurationEntry方法
我们ctrl+左键找到此方法,找到getCandidateConfigurations方法
在方法中找到loadFactoryNames方法
经过层层的寻找,终于在最后找到了获取资源的路径,是在META-INF/spring.factories文件中
Spring Boot自动装配的本质就是通过Spring去读取META-INF/spring.factories中保存的配置类文件然后加载bean定义的过程。
在jar包中,我们去寻找一下这个文件
可以看到,里面有非常多的配置,其中红框中的就是常见的ElasticSearch、MongoData、Redis、SpringData。。。
这就是为什么Spring Boot不用再去让我们再去关注配置的原因
那么这么多配置信息,在Spring Boot启动的时候都会为我们配置上吗?那不用的配置也要配置吗?其实这点Sring Boot早就考虑到了,这些配置信息,只有我们添加了相关依赖才会为我们进行配置。
那么Spring Boot是通过什么来实现根据添加的依赖进行加载对应配置信息呢?
我们可以随便找一个第三方配置类进去看一下,这里我选择redis
可以看到,这里有一个注解没有见过,@ConditionalOnClass注解,这个注解的作用就是检查是否导入相关依赖,如果没有导入,则该类各个方法就会报错
3、总结经过上面的分析,Spring Boot的自动装配原理总结一句话为:
Spring Boot启动的时候加载主配置类,其中@EnableAutoConfiguration注解会通过@Import注解扫描所有jar包类路径下的"META-INF/spring.factories",里面标注了自动配置类,自动配置类会通过
@ConditionalOnClass注解检测是否添加了相关依赖,如果添加了相关依赖会把自动配置类中bean添加到容器中,完成自动配置。
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
名称栏目:SpringBoot自动配置原理(SpringBoot面试题)-创新互联
网站URL:http://cdiso.cn/article/ispcj.html