SpringBoot中@SpringBootApplication的详解

相关阅读

第一个SpringBoot项目与依赖注入的详解

前言

@SpringBootApplication: Spring Boot应用标注在某个类上说明这个类是SpringBoot的主配置类,SpringBoot就应该允许这个类的main方法来启动SpringBoot应用。

那么它背后的原理是怎样的呢?

1.点击进入@SpringBootApplication你会发现两个重要的注解
@SpringBootConfiguration和@EnableAutoConfiguration

在这里插入图片描述
在这里插入图片描述

2.对@SpringBootConfiguration的解析

在这里插入图片描述在这里插入图片描述
再往里点的话
在这里插入图片描述

小结: @SpringBootConfiguration:SpringBoot的配置类,标注在某个类上,表示这是一个Spring Boot的配置类 它的底层其实也是@Configuration表示这是一个配置类,而它的再底层其实是@Component(配置类---->配置文件;所以配置类其实也是容器中的一个组件)
3.对@EnableAutoConfiguration的解析在这里插入图片描述
这里其实是@AutoConfigurationPackage和@Import({EnableAutoConfigurationImportSelector.class})

在这里插入图片描述

3.1 @AutoConfigurationPackage:表示扫描自动配置包,也就是标注了@SpringBootApplication所在包及下面的所有子包里面所有的组件扫描到Spring容器
实现机制:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.2 @Import({EnableAutoConfigurationImportSelector.class})的作用是导入组件的选择器。该选择器是将所有需要导入的组件以全类名的方式返回,这些组件会被添加到容器中。会给容器导入非常多的自动配置类(xxxAutoConfiguration):就是给容器中导入这个场景所有的组件,并配置好这些组件。
实现机制:在这里插入图片描述在这里插入图片描述

在这里插入图片描述

1)如上图所示,我们返回了一个注解信息的数组,只要我们在57行打上断点,并进入Debug模式我们会发现configurations数组中的值为

在这里插入图片描述

2) 那我们是如何获取这些配置类信息的呢?
它是通过上面方法的64行
 List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);去获取候选的配置文件
2.1) 点击进入getCandidateConfigurations( )该方法

在这里插入图片描述

上面方法中的第95行

List configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader());
这个方法中的this.getSpringFactoriesLoaderFactoryClass()表示的类是EnableAutoConfiguration.class;
而 this.getBeanClassLoader()则是一个类加载器

2.2)继续点击进入loadFactoryNames()的方法

在这里插入图片描述

从上面的方法中我们可以看到这个类加载器是通过去扫描我们类路径下的META-INF/spring.factories去获取EnableAutoConfiguration指定的值,将这些值作为自动配置类导入到容器中,自动配置类就生效了。以前我们需要自己配置的东西,自动配置类已经帮我们完成。
2.3) 那我们还有最后一个疑问,该类加载器加载的文件具体内容是什么呢?

在这里插入图片描述

这也就解释了上面configurations数组中配置类信息的由来了。
小结:
其实@SpringBootApplication通过它的 @SpringBootConfiguration告诉SpringIOC容器,我的这个类是Spring Boot的配置类。然后再通过@EnableAutoConfiguration先进行该包下注解的扫描,最后完成一些该应用场景下自动配置组件的注入(这个自动配置的注入就像我们Spring MVC中编写大量的xml文件进行相关的整合,不过Spring Boot帮我们完成了这些配置)
发布了46 篇原创文章 · 获赞 2 · 访问量 2860

猜你喜欢

转载自blog.csdn.net/TheWindOfSon/article/details/104316278