SpringBoot3自动配置原理

这篇具有很好参考价值的文章主要介绍了SpringBoot3自动配置原理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

​​​​​​自动配置

遵循约定大约配置的原则,在boot程序启动后,起步依赖中的一些bean对象会自动注入到ioc容器

看一下我们前面写的代码有没有达到自动配置的效果呢?

SpringBoot3自动配置原理,spring boot

没有自动,我们写了配置类,写了@Import注解,所以并没有达到自动配置的效果。那怎么办呢?接下来我们通过翻看源码的方式来了解一下SpringBoot自动配置是怎么回事!了解完毕之后我们照葫芦画瓢就可以解决问题!

自动配置-源码分析

程序引入spring-boot-starter-web 起步依赖,启动后,会自动往ioc容器中注入DispatcherServlet

接下来我们验证一下,看它有没有自动注入DispatcherServlet

创建一个SpringBoot工程

这里没有 web起步依赖

 <dependencies>
        <!--springboot核心起步依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

主启动

@SpringBootApplication
public class SpringbootAutoConfigApplication {
​
    public static void main(String[] args) {
        ApplicationContext context = SpringApplication.run(SpringbootAutoConfigApplication.class, args);
        System.out.println(context.getBean("dispatcherServlet"));
    }
}

这时候工程里面没有 web起步依赖 就没有 DispatcherServlet,这里就会报错

SpringBoot3自动配置原理,spring boot

导入 web起步依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

SpringBoot3自动配置原理,spring boot

那就验证了之前的话,如果你引入了web起步依赖,就会自动往ioc容器中注入一个DispatcherServlet,那SpringBoot如何做到的呢?接下来就要翻一下源码了。

源码解读

@SpringBootApplication 注解

SpringBoot3自动配置原理,spring boot

我们进入这个注解,它的头上怎么顶着这么多注解,不过真正重要的只有三个注解,我们接下来会 一 一介绍。

@Target(ElementType.TYPE)  //元注解,可以在类上面使用 @Retention(RetentionPolicy.RUNTIME) //元注解,运行时阶段

@Documented  //生成Java文档

@Inherited  //是一个标识,用来修饰注解

SpringBoot3自动配置原理,spring boot

@SpringBootConfiguration 注解

点进@SpringBootConfiguration注解,可以发现其核心注解为@Configuration注解:

SpringBoot3自动配置原理,spring boot

@Configuration注解是Spring框架的注解之一,用于标记配置类。 在Spring Boot中,使用@Configuration注解可以将该类作为配置类,从而使该类中的Bean可以被Spring IoC容器管理和使用。

在配置类中,我们可以使用另外两个注解@Bean和@Scope来定义Bean,其中@Bean注解用于定义Bean对象,而@Scope注解用来指定Bean对象的作用域。

总的来说,@Configuration注解能够将一个类定义为Spring Boot应用程序中的配置类,从而使该类中的Bean对象能够被Spring IoC容器进行自动管理和装配。这让应用开发者能够更加专注于应用逻辑的实现,而不必花费精力在繁琐的配置上。 所以@SpringBootConfiguration注解本质上就是一个@Configuration注解,用来标注某个类为 JavaConfig 配置类,有了这个注解就可以在 SpringBoot 启动类中使用@Bean标签配置类了。

@ComponentScan 注解

SpringBoot3自动配置原理,spring boot

@ComponentScan 是 Spring Framework 中的一个注解,它用于指定 Spring 容器需要扫描和管理的组件。组件是 Spring 中的一个抽象概念,它包括了 Spring Bean、Controller、Service、Repository 等等。通过 @ComponentScan 注解,可以让 Spring 容器自动扫描和管理这些组件,从而简化应用程序的配置和管理。 @ComponentScan 注解有多个参数,可以用于指定要扫描的组件的位置、排除不需要扫描的组件、指定要排除扫描的组件等等。

默认情况下,Spring Boot会自动扫描主应用程序下的所有组件(@Configuration, @Controller, @Service, @Repository等),但是如果你将组件放在其他包下,那么就需要显式地配置扫描目录。

@EnableAutoConfiguration 注解

这是今天的主角中的主角,自动配置实现的核心注解。 点进这个注解可以发现,如下图所示。

SpringBoot3自动配置原理,spring boot

我们重点来看 @Import(AutoConfigurationImportSelector.class)这个注解。 @Import 注解是 它用于将一个或多个类导入到 Spring 容器中,以便于在应用程序中使用。通过 @Import 注解,我们可以将一些非 Spring 管理的类实例化并注册到 Spring 容器中,或者将一些 Spring 管理的配置类导入到当前配置类中,以便于在应用程序中进行统一的配置和管理。 @Import是Spring Framework 中的一个注解,用于在配置类中导入其他配置类或者普通的Java类。

说白了在这里@Import注解的作用就是将 AutoConfigurationImportSelector 这个类导入当前类,这个类就是实现自动配置的核心。 我们继续进入到 AutoConfigurationImportSelector 类:

SpringBoot3自动配置原理,spring boot

AutoConfigurationImportSelector实现了DeferredImportSelector接口,我们进入DeferredImportSelector接口

SpringBoot3自动配置原理,spring boot

最后,我们发现, AutoConfigurationImportSelector 实际上是实现了 ImportSelector 接口,这个接口只有两个方法,其中我们需要重点关注 selectImports() 方法。

ImportSelector 接口是 Spring Framework 中的一个接口,它可以用于在 Spring 容器启动时动态地导入一些类到 Spring 容器中。通过实现 ImportSelector 接口,并重写其中的 selectImports 方法,我们可以自定义逻辑来确定需要导入的类,从而实现更加灵活的配置和管理。

SpringBoot3自动配置原理,spring boot

selectImports 方法是 ImportSelector 接口中的一个方法,用于返回需要导入的类的全限定类名数组。在 Spring 容器启动时,Spring 会扫描所有实现了 ImportSelector 接口的类,并调用其中的 selectImports 方法来确定需要导入的类。

我们进入getAutoConfigurationEntry()方法

SpringBoot3自动配置原理,spring boot

这里返回AutoConfigurationEntry类,里面传入了 configurations和exclusions两个参数, configurations参数通过getCandidateConfigurations() 方法得到,我们进入getCandidateConfigurations()方法。

SpringBoot3自动配置原理,spring boot

Assert.notEmpty这是一个断言,configurations不能为空 ,如果为空了,给你一段提示:没有自动配置的类找到,在 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports找到,我们将这端配置简称为 .imports 文件,意思就是说,我要去找自动配置类 去 .imports中找,但是我并没有找到,我们需要关注这个配置文件在什么地方,这里先回到pom.xml文件中

SpringBoot3自动配置原理,spring boot

进去核心起步依赖,这里面引入了一个:spring-boot-autoconfigure,autoconfigure顾名思义就是自动配置的意思。

SpringBoot3自动配置原理,spring boot

接下来我们去找到autoconfigure

在这里我们找到了 AutoConfiguration.imports配置文件

SpringBoot3自动配置原理,spring boot

SpringBoot3自动配置原理,spring boot

点进去,这个配置文件其实就是配置了一堆类的全类名,这些类都是自动配置类,接下来我们去看看之前演示的DispatcherServlet相关的自动配置类 Ctrl+F:搜索一下

SpringBoot3自动配置原理,spring boot

进入:DispatcherServletAutoConfiguration类 , Ctrl+Shift+N全局搜索进入这个类

SpringBoot3自动配置原理,spring boot

@AutoConfiguration(after = {ServletWebServerFactoryAutoConfiguration.class})顾名思义,自动配置的意思

SpringBoot3自动配置原理,spring boot

@AutoConfiguration点进去,你会发现它也是一个组合注解,组合了一个@Configuration()

SpringBoot3自动配置原理,spring boot

说白了DispatcherServletAutoConfiguration这个类是一个配置类

SpringBoot3自动配置原理,spring boot

这个类用了@AutoConfiguration注解,更加见名之意它是一个配置类

SpringBoot3自动配置原理,spring boot

我们再看@ConditionalOnClass这个注解,是不是很熟悉,前面讲到过:它在这里的意思是,如果你环境里面有DispatcherServlet,那自动配置类就会生效自动注入一个DispatcherServlet的bean对象,如果环境里没有DispatcherServlet,那就不生效,不注入了。

接下来继续往下看

SpringBoot3自动配置原理,spring boot

这里内部有一个DispatcherServletConfiguration类,也配置@Configuration注解,里面写一个方法,方法最终返回的就是dispatcherServlet,方法上面有@Bean注解,最终我们可以看到,它注入DispatcherServlet的代码在这里,其实你会发现这里的代码和我们之前写的代码并没有很大的区别,都是写一个方法,让后在方法上面声明一个@Bean注解。

这里最核心的是,它把这个类DispatcherServletAutoConfiguration写到指定的配置文件里面了,那么SpringBoot就可以自动的去读取这个全类名,把这个配置的类的对象注入到Ioc容器中,由于这个配置类的内部还有配置类DispatcherServletConfiguration,内部的配置类里面还有一些方法,这些方法声明了@Bean注解,所以SpringBoot它会继续解析,直到把这些@Bean注解的方法都解析到,执行这些方法,然后把返回值注入到IOC容器里。

因此我们自动配置的核心在哪?核心核心,在这个.imports配置文件中,那么源码我们就到这。

SpringBoot3自动配置原理,spring boot

小总结

SpringBoot3自动配置原理,spring boot

在SpringBoot2.7版本以前,它自动配置使用的配置文件是 spring.factories,它会从 spring.factories配置文件中读取配置类的全类名,那么在SpringBoot2.7以后到3.0以前,它同时兼容了.imports配置文件以及spring.factories配置文件,在3.0以后只支持.imports配置文件,这个大家要清楚。

通过源码分析,我们知道了,SpringBoot自动配置无非就是提供一个自动配置类,把这个类名写到指定的配置文件中就可以了。

说一说SpringBoot自动配置原理?

SpringBoot3自动配置原理,spring boot

希望可以帮到大家,喜欢的给冯宝宝点个关注把,蟹蟹支持!!文章来源地址https://www.toymoban.com/news/detail-813571.html

到了这里,关于SpringBoot3自动配置原理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring Boot的自动配置原理

    Spring Boot的自动配置是Spring框架的一个重要特性,它旨在简化应用程序的开发和部署过程。自动配置通过基于类路径中的依赖关系和配置文件内容来预先配置Spring应用程序的各种组件和功能。这样,我们可以在无需显式配置大量参数的情况下,快速搭建一个运行良好的Spring应

    2024年02月14日
    浏览(37)
  • 【SpringBoot3】Spring Boot 3.0 介绍以及新特性

    Spring Boot 3.0 是 Spring Boot 框架的一个重要版本,它在保持了 Spring Boot 的一贯优点的同时,也进行了一些重要的改进和更新。 首先,Spring Boot 3.0 对 Java 版本的要求进行了更新。这个版本要求使用 Java 17 作为最低版本,以利用最新的语言特性和性能改进。如果你正在使用的是

    2024年01月17日
    浏览(86)
  • 【SpringBoot3】Spring Boot 3.0 集成 Redis 缓存

    Redis缓存是一个开源的使用ANSIC语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。它主要用于作为数据库、缓存和消息中间件,以快速读写和丰富的数据结构支持而著称。 在应用程序和数据库之间,Redis缓存作为一个中间层起着关键

    2024年02月21日
    浏览(56)
  • Spring Boot中的Elasticsearch自动配置:原理与使用

    在Spring Boot中,Elasticsearch是非常流行的搜索引擎。为了方便开发人员使用Elasticsearch,Spring Boot提供了Elasticsearch自动配置功能。本文将介绍Elasticsearch自动配置的原理与使用。 Elasticsearch自动配置是Spring Boot对Elasticsearch进行封装的一种方式,它主要是通过将Elasticsearch相关的配置

    2024年02月12日
    浏览(53)
  • SpringBoot3.0新特性:1、spring.factories文件废弃,自动配置包位置变化 2、Spring Native 快速体验 3、jakata api迁移 3、三方库的支持

    有自己写过starter包的友友们一定知道,一定用/META-INF/spring.factories文件定义发现自动配置,但是在springboot 2.7,这个文件就被弃用了,在springboot 3.0 就被彻底移除了。 比如之前定义的/META-INF/spring.factories文件: 而现在 这个/META-INF/spring.factories并不是不存在了,只是在3.0之后 外

    2024年02月10日
    浏览(46)
  • Spring Boot中RabbitMQ自动配置的介绍、原理和使用

    RabbitMQ是一种高性能的消息队列系统,它支持多种消息协议和丰富的功能,如消息路由、消息确认、消息重试、死信队列等。在Spring Boot中,我们可以通过自动配置的方式来使用RabbitMQ。本文将介绍Spring Boot中RabbitMQ自动配置的介绍、原理和使用方法。 在Spring Boot中,我们可以通

    2024年02月11日
    浏览(59)
  • 1024程序员节特辑:【Spring Boot自动配置原理揭秘】

    主页传送门:📀 传送   Spring Boot 是一个用于创建独立的、生产级别的 Spring 应用程序的框架。它极大地简化了 Spring 应用程序的开发过程,其中一个关键的功能就是自动配置(Auto-Configuration)。   自动配置可以根据项目需求自动配置各种服务和组件,它可以帮助开发者

    2024年02月08日
    浏览(69)
  • Spring(8) Springboot自动配置原理

    Springboot 的自动配置原理,是Springboot中最高频的一道面试题,也是Springboot框架最核心的思想。 首先我们看一张我总结的自动配置原理概览图: 下面,我们就根据这张图详细描述一下具体过程: 首先,我们来看一段代码: 上面就是一段普通的 Springboot 引导类代码,这里有一

    2024年02月12日
    浏览(42)
  • springboot3.2报Spring Boot [3.2.0] is not compatible with this Spring Cloud release train

    这个解决也比较简单: 1、直接把springcloud升级为2023.0.0-RC1就行了 2、第二种,直接进行配置,关闭检查,但是微服务的相关服务可能无法使用,需要自行验证 spring.cloud.compatibility-verifier.enabled=false

    2024年02月20日
    浏览(50)
  • Java --- springboot3依赖管理和自动配置机制

    目录 一、依赖管理机制 二、自动配置机制  三、自动配置流程 🚕 、为什么导入 starter-web 所有相关依赖都导入进来? ①、开发什么场景,导入什么 场景启动器。 ②、maven依赖传递原则。A-B-C: A就拥有B和C ③、导入 场景启动器。 场景启动器 自动把这个场景的所有核心依赖

    2024年02月07日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包