广告
返回顶部
首页 > 资讯 > 后端开发 > Python >SpringBoot原理之自动配置机制详解
  • 476
分享到

SpringBoot原理之自动配置机制详解

2024-04-02 19:04:59 476人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录前言 spring配置类 SpringBoot自动配置 自动配置的概念 自动配置的运行机制 加载方式 SpringFactoriesLoader机制 SpringFactorie

前言

在当下的java生态里,SpringBoot已经成为事实上的开发标准,绝大多数人现在都是面向SpringBoot编程。SpringBoot是对Spring的进一步封装,整合了分布式系统上下游所需的各种类库和组件,并且实现了开箱即用,而这一切的底层基础就是SpringBoot的自动配置机制。

Spring配置类

Spring引入配置类是为了:1)替换冗长繁琐的配置文件,2)提供更灵活的bean定义方式。使用@Configuration注解去标记一个配置类,通过其中含有@Bean注解的方法去创建一个bean,如下代码


@Configuration
public class HelloAutoConfiguration {

    @Bean
    HelloService helloService() {
        return new HelloService;
    }

}

即为一个简单的配置类,并且定义了一个HelloService的bean。在此之上,Spring还提供了一套条件加载机制,可以去动态控制一个配置类是否被加载。通过实现org.springframework.context.annotation.Condition接口,开发者就可以自己控制配置类的加载条件,满足很多复杂的场景

SpringBoot自动配置

介绍完了Spring的配置类,我们来看看SpringBoot是怎么利用这套机制去实现自动配置的。

自动配置的概念

首先,什么是自动配置?我们看一下SpringBoot对于自动配置类的定义:

Auto-configuration classes are regular Spring @Configuration beans. They are located using the SpringFactoriesLoader mechanism (keyed against this class). Generally auto-configuration beans are @Conditional beans (most often using @ConditionalOnClass and @ConditionalOnMissingBeanannotations).

自动配置类就是一个普通的@Configuration配置类,通常会带有一些@Conditional条件注解,并且使用SpringFactoriesLoader机制去定位加载它们(并非都是如此,还有其他一些Spring固有的加载方式,比如通过@ComponentScan包扫描或者显式@Import方式都可以让它们被发现)。

自动配置的运行机制

加载方式

自动配置机制的启用是通过@EnableAutoConfiguration注解去控制的,因此需要在SpringBoot工程的入口类上启用该注解,但是通常,我们一般使用@SpringBootApplication来代替,后者是一个注解的合集,包含了一些必要的默认配置,其中就有@EnableAutoConfiguration注解,其类的注释上是这么描述的:

Indicates a Configuration class that declares one or more @Bean methods and also triggers auto-configuration and component scanning. This is a convenience annotation that is equivalent to declaring @Configuration, @EnableAutoConfiguration and @ComponentScan.

它本身既标识一个配置类,同时也开启了自动配置和组件扫描。

回到@EnableAutoConfiguration注解上,我们看一下该注解的定义


@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
    String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";

    Class<?>[] exclude() default {};

    String[] excludeName() default {};
}

其中@Import(AutoConfigurationImportSelector.class)是功能生效的关键,该注解导入了AutoConfigurationImportSelector组件到Spring环境中,开启自动配置类的扫描加载工作,该类实现了接口org.springframework.context.annotation.ImportSelector


public interface ImportSelector {

    
    String[] selectImports(AnnotationMetadata importinGClaSSMetadata);

   ....其他省略
}

其中selectImports方法会在Spring启动时被调用,用于返回所有的自动配置类,调用入口在org.springframework.context.annotation.ConfigurationClassParser类中,该类是Spring专门用来加载处理所有@Configuration配置类的,具体的加载细节,限于篇幅问题,就不在本文中展开说明了,读者们可自行去阅读源码,本人也许会在后续再另开一篇详细说明。接着说selectImports方法,我们来看一下自动配置类的加载过程,AutoConfigurationImportSelector对于该方法的具体实现为


    @Override
    public String[] selectImports(AnnotationMetadata annotationMetadata) {
        if (!isEnabled(annotationMetadata)) {
            return NO_IMPORTS;
        }
        AutoConfigurationEntry autoConfigurationEntry = getAutoConfigurationEntry(annotationMetadata);
        return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
    }

isEnabled方法是一个开关,用于控制是否启用自动配置,逻辑很简单,略过不提,往下看,关键逻辑在getAutoConfigurationEntry方法中,跟下去


    protected AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) {
        if (!isEnabled(annotationMetadata)) {
            return EMPTY_ENTRY;
        }
        AnnotationAttributes attributes = getAttributes(annotationMetadata);
        List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);
        configurations = removeDuplicates(configurations);
        Set<String> exclusions = getExclusions(annotationMetadata, attributes);
        checkExcludedClasses(configurations, exclusions);
        configurations.removeAll(exclusions);
        configurations = getConfigurationClassFilter().filter(configurations);
        fireAutoConfigurationImportEvents(configurations, exclusions);
        return new AutoConfigurationEntry(configurations, exclusions);
    }

很容易看到加载逻辑在getCandidateConfigurations方法中,后续代码是去重和过滤的过程,再往下看


    protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
        List<String> configurations = SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(),
                getBeanClassLoader());
        Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you "
                + "are using a custom packaging, make sure that file is correct.");
        return configurations;
    }

这个方法就很简单明显了,直接调用SpringFactoriesLoader去加载对应的内容,接下来我们再聊聊SpringFactoriesLoader机制是怎么回事。

SpringFactoriesLoader机制

SpringFactoriesLoader直译过来就是工厂加载机制,是Spring仿照Java的SPI机制实现的一套类加载机制,通过读取模块内的META-INF/spring.factories文件来加载类,该文件为Properties格式,其中key部分是一个Class全限定名称,可以是一个接口、抽象类或者注解等,而value部分是一个支持逗号分割的实现类列表,比如

而SpringFactoriesLoader就是Spring提供的一个用于读取解析META-INF/spring.factories文件的工具类,通过传入一个Class类型加载其对应的实现类列表。

SpringFactoriesLoader如何应用在自动配置中

介绍完了SpringFactoriesLoader,我们来研究一下SpringBoot的自动配置机制中是怎么使用它的,回到上面的getCandidateConfigurations方法中,我们看一下这一行


List<String> configurations = SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(),
                getBeanClassLoader());

其中第一个参数是key对应Class类型,第二个参数是用哪个ClassLoader去加载配置文件,我们看一下getSpringFactoriesLoaderFactoryClass这个方法返回的具体Class是什么


    protected Class<?> getSpringFactoriesLoaderFactoryClass() {
        return EnableAutoConfiguration.class;
    }

很简单,直接返回@EnableAutoConfiguration注解对应的class类型,那么自动配置类在META-INF/spring.factories文件中的配置方式就显而易见了,上面截图中最前面的部分


# AutoConfiguration
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.cloud.autoconfigure.ConfigurationPropertiesRebinderAutoConfiguration,\
org.springframework.cloud.autoconfigure.LifecyclemvcEndpointAutoConfiguration,\
org.springframework.cloud.autoconfigure.RefreshAutoConfiguration,\
org.springframework.cloud.autoconfigure.RefreshEndpointAutoConfiguration,\
org.springframework.cloud.autoconfigure.WritableEnvironmentEndpointAutoConfiguration

就是对应的自动配置类了。这些被配置在此处的类都会被作为自动配置类加载到Spring中,然后进行相应的处理,发挥出每个类的功能作用。

小结

SpringBoot的自动配置机制就简单介绍到这里了,相信看官们看完了之后也都有了一些了解,当然这篇文章里还有很多相关内容没有涉及到,包括自动配置类的条件加载方式、多个类之间的加载顺序控制、排除和过滤机制,以及如何自定义自动配置类、重写框架默认行为等等,这些内容笔者会在后续的文章中再进行详细探讨。

到此这篇关于SpringBoot原理之自动配置机制的文章就介绍到这了,更多相关SpringBoot自动配置机制内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: SpringBoot原理之自动配置机制详解

本文链接: https://www.lsjlt.com/news/157211.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • SpringBoot原理之自动配置机制详解
    目录前言 Spring配置类 SpringBoot自动配置 自动配置的概念 自动配置的运行机制 加载方式 SpringFactoriesLoader机制 SpringFactorie...
    99+
    2022-11-12
  • SpringBoot自动配置原理详解
    目录阅读收获一、SpringBoot是什么二、SpringBoot的特点三、启动类3.1 @SpringBootApplication四、@EnableAutoConfigurati...
    99+
    2022-11-12
  • SpringBoot超详细讲解自动配置原理
    目录SpringBoot自动配置原理SpringBoot特点1.依赖管理A.父项目做依赖管理B.开发导入starter场景启动器C.可以修改默认版本号2.自动配置A.自动配好Tomc...
    99+
    2022-11-13
  • SpringBoot自动装配原理详解
    目录summarydetail以Redis举例原理和结果分析依赖的注解自动装配的过程summary detail 传统的Spring项目会有很多的配置文件,比如我们要使用Redis,...
    99+
    2023-05-15
    Java SpringBoot SpringBoot自动装配原理
  • springboot自动配置原理解析
    目录前言开始总结前言 小伙伴们都知道,现在市面上最流行的web开发框架就是springboot了,在springboot开始流行之前,我们都用的是strust2或者是springm...
    99+
    2022-11-12
  • SpringBoot原理中自动配置机制是怎样的
    本篇文章为大家展示了SpringBoot原理中自动配置机制是怎样的,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。前言在当下的java生态里,SpringBoot已经成为事实上的开发标准,绝大多数人现...
    99+
    2023-06-25
  • Java SpringBoot自动装配原理详解
    目录自动装配的含义springboot应用程序启动类总结自动装配的含义 在SpringBoot程序main方法中,添加@SpringBootApplication或者@EnableA...
    99+
    2022-11-12
  • Springboot启动原理和自动配置原理解析
    目录启动原理SpringApplication1、初始化2、调用run方法自动配置原理放本地文件夹都快吃土了,准备清理文件夹,关于Springboot的! 启动原理 @SpringB...
    99+
    2023-05-17
    Springboot启动原理和自动配置 Springboot自动配置 Springboot启动
  • SpringBoot自动装配的原理详解分析
    目录前言自动装配案例自动装配分析自动装配总结前言 关于 ​​SpringBoot​​​ 的自动装配功能,相信是每一个 ​​Java​​ 程序员...
    99+
    2022-11-13
    SpringBoot 自动装配原理 SpringBoot 自动装配
  • SpringBoot server.port配置原理详解
    目录SpringBoot server.port配置原理1. autoConfigure2. embed tomcat如何使用小结一下server.port不起作用SpringBoo...
    99+
    2022-11-12
  • SpringBoot 自动配置原理及源码解析
    初始化一个Springboot项目,在主启动类会有这么一个注解:@SpringBootApplication,自动装配的秘密全在主启动类这个注解里面了 点进去一层会发现有三个子注解组...
    99+
    2022-11-12
  • Springboot自动加载配置的原理解析
    目录1、springboot自动配置的原理初探2. 补充扩展(解释为什么引用的包都报红错了,项目还能启动)3、又一个问题总结1、springboot自动配置的原理初探 以下注解都在...
    99+
    2022-11-12
  • Springboot@Configuration与自动配置详解
    不知道大家第一次搭SpringBoot环境的时候,有没有觉得非常简单。无须各种的配置文件,无须各种繁杂的pom坐标,一个main方法,就能run起来了。与其他框架整合也贼方便,使用E...
    99+
    2022-11-13
  • 详解SpringBoot自动配置源码
    一、引导加载自动配置类 @SpringBootApplication注解相当于@SpringBootConfiguration、@EnableAutoConfiguration、@C...
    99+
    2022-11-12
  • Springboot自动配置与@Configuration配置类详解
    目录@Configuration注意点1注意点2注意点3注意点4springboot自动配置@Configuration 注意点1 配置类(@Configuration下的这个类)其...
    99+
    2022-11-13
  • Springboot-yaml配置和自动配置原理分析
    目录版本仲裁中心自动配置原理yaml语法和@PropertySource注解一起使用和@ImportResource一起使用配置文件占位符profile配置文件的加载顺序版本仲裁中心...
    99+
    2022-11-12
  • springboot自动配置原理以及spring.factories文件的作用详解
    目录一、springboot 自动配置原理二、spring.factories文件的作用spring.factories 的妙用什么是 SPI 机制?Spring Boot 中的 S...
    99+
    2022-11-12
  • SpringBoot自动配置的原理分析
    这篇文章主要介绍了SpringBoot自动配置的原理分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇SpringBoot自动配置的原理分析文章都会有所收获,下面我们一起来看看吧。初始化一个Springboot...
    99+
    2023-06-08
  • springboot自动配置原理是什么
    Spring Boot的自动配置原理是基于条件注解和条件判断的。Spring Boot通过在配置类上使用@EnableAutoCon...
    99+
    2023-08-23
    springboot
  • Springboot-yaml配置和自动配置的原理分析
    本篇内容主要讲解“Springboot-yaml配置和自动配置的原理分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Springboot-yaml配置和自动配置的原理分析”吧!版本仲裁中心sp...
    99+
    2023-06-08
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作