SpringBoot自动装配原理分析,比如@SpringBootApplication注解,@SpringBootConfiguration注解,@EnableAutoConfiguration注解

导读:本篇文章讲解 SpringBoot自动装配原理分析,比如@SpringBootApplication注解,@SpringBootConfiguration注解,@EnableAutoConfiguration注解,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

1. 文章引言

先看看SpringBoot的主配置类:

/**
 * @author super先生
 * @datetime 2022/8/5 15:16
 * @desc superjson框架的启动类
 */
@SpringBootApplication
@Slf4j
public class SuperJsonManagerApplication {

  public static void main(String[] args) {
    ConfigurableApplicationContext run =
        SpringApplication.run(SuperJsonManagerApplication.class, args);
  }
}

main方法运行了一个run()方法,在run方法中必须要传入一个被@SpringBootApplication注解的类。

SpringBoot应用标注在某个类上说明这个类是SpringBoot的主配置类,SpringBoot就会运行这个类的main方法来启动SpringBoot项目。

2. @SpringBootApplication

@SpringBootApplication注解到底是什么呢?点进去看看发现@SpringBootApplication是一个组合注解,如下图所示:

在这里插入图片描述

2.1 @SpringBootConfiguration

先看看@SpringBootConfiguration注解:

在这里插入图片描述

这个注解很简单,表明该类是一个Spring的配置类,再进去看看@Configuration

在这里插入图片描述

说明Spring的配置类也是Spring的一个组件。

2.2 @EnableAutoConfiguration

这个注解是开启自动配置的功能。

在这里插入图片描述

  1. 看看@AutoConfigurationPackage注解:

在这里插入图片描述

这个注解是自动配置包,主要是使用的@Import来给Spring容器中导入一个组件 ,这里导入的是Registrar.class,如下图所示:

在这里插入图片描述

就是通过这个方法获取扫描的包路径,在如下行代码上打一断点,debug看看:

在这里插入图片描述

启动项目后进入断点,已经获取到了包路径,如下图所示:

在这里插入图片描述

注意断点出的metadata(元空间),这是什么呢?可以看到是标注在@SpringBootApplication注解上的SuperJsonManagerApplication,也就是我们的主配置类:

在这里插入图片描述

说白了就是将主配置类(即@SpringBootApplication标注的类)的所在包及子包里面所有组件扫描加载到Spring容器。所以包名一定要注意。

  1. @Import({AutoConfigurationImportSelector.class})

现在包扫描路径获取到了,那具体加载哪些组件呢,看看这个注解:@Import({AutoConfigurationImportSelector.class})

在这里插入图片描述

@Import注解就是给Spring容器中导入一些组件,这里传入了一个组件的选择器:AutoConfigurationImportSelector

里面有一个selectImports方法,将所有需要导入的组件以全类名的方式返回,这些组件就会被添加到容器中:

在这里插入图片描述

因为我的spring boot版本为2.5.0,有的版本的代码可能如下这样:

在这里插入图片描述

但这不影响使用,只是版本不同,核心代码都一样。

debug运行时可以看到,它给容器中导入非常多的自动配置类(xxxAutoConfiguration),就是给容器中导入这个场景需要的所有组件,并配置好这些组件,如下图所示:

在这里插入图片描述

有了自动配置类,免去了我们手动编写配置注入功能组件等的工作。

那他是如何获取到这些配置类的呢,点击getAutoConfigurationEntry(annotationMetadata)进入该方法,然后再进入getCandidateConfigurations(annotationMetadata, attributes)方法,可以看到如下图所示的方法:

在这里插入图片描述

点击loadFactoryNames进入该方法后,再点击进入loadSpringFactories方法,如下图所示:

在这里插入图片描述

loadFactoryNames会从META-INF/spring.factories中获取资源,然后通过Properties加载资源。

3. 总结

Spring Boot在启动的时候从类路径下的META-INF/spring.factories中获取EnableAutoConfiguration指定的值,将这些值作为自动配置类导入到容器中,自动配置类就生效,帮我们进行自动配置工作。以前我们需要自己配置的东西,自动配置类都帮我们完成了。

比如看看WebMvcAutoConfiguration,都已经帮我们配置好了,我们不用再单独配置了:

在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/99090.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!