Spring Boot自动配置原理(Spring Boot面试题)

目录

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只是其中一个

<!--spring-boot启动器-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
</dependency>

<!--springboot-web启动包-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--springboot-xxx启动包-->

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添加到容器中,完成自动配置。

猜你喜欢

转载自blog.csdn.net/select_myname/article/details/128191527