[SpringBoot]Spring如何启用依赖?@EnableAutoConfiguration与SpringFactoriesLoader来助你!

SpringFactoriesLoader 与 @EnableAutoConfiguration 的关系详解

在 Spring Boot 中,自动配置(Auto-configuration)是一个核心特性,它能够根据项目的依赖自动配置 Spring 应用程序。@EnableAutoConfiguration 是 Spring Boot 中用于启用自动配置的核心注解,而 SpringFactoriesLoader 是 Spring 框架中用于加载和实例化工厂类的基础工具。本文将详细探讨 SpringFactoriesLoader@EnableAutoConfiguration 之间的关系,并解释它们是如何协同工作的。同时,我们还会讨论如何在 spring.factories 文件中配置多个需要被注入的类。


1. SpringFactoriesLoader 简介

SpringFactoriesLoader 是 Spring 框架中的一个工具类,用于加载和实例化 META-INF/spring.factories 文件中定义的工厂类。spring.factories 文件通常位于项目的 resources 目录下,它是一个属性文件,格式如下:

properties 复制代码
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.MyAutoConfiguration,\
com.example.AnotherAutoConfiguration

SpringFactoriesLoader 的主要作用是加载这些配置类,并将它们实例化为 Spring 容器中的 Bean。它的核心方法是 loadFactories,该方法会根据指定的工厂类型从 spring.factories 文件中加载对应的实现类。

java 复制代码
public static <T> List<T> loadFactories(Class<T> factoryType, @Nullable ClassLoader classLoader) {
    // ...
}

2. @EnableAutoConfiguration 的作用

@EnableAutoConfiguration 是 Spring Boot 中用于启用自动配置的注解。它的主要作用是告诉 Spring Boot 根据项目的依赖自动配置 Spring 应用程序。当你在主类上添加 @EnableAutoConfiguration 注解时,Spring Boot 会自动扫描 META-INF/spring.factories 文件中的 EnableAutoConfiguration 配置项,并将这些配置类加载到 Spring 容器中。

java 复制代码
@SpringBootApplication
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}

@SpringBootApplication 注解实际上是一个组合注解,它包含了 @EnableAutoConfiguration@ComponentScan@Configuration 三个注解。因此,当你使用 @SpringBootApplication 时,自动配置功能已经默认启用。


3. SpringFactoriesLoader 与 @EnableAutoConfiguration 的关系

@EnableAutoConfigurationSpringFactoriesLoader 之间的关系可以概括为:@EnableAutoConfiguration 依赖于 SpringFactoriesLoader 来加载和实例化自动配置类。

3.1 自动配置类的加载过程

  1. 启动 Spring Boot 应用程序 :当 Spring Boot 应用程序启动时,SpringApplication 类会调用 run 方法,该方法会初始化 Spring 容器并加载所有的配置类。

  2. 处理 @EnableAutoConfiguration 注解 :在 Spring 容器初始化的过程中,@EnableAutoConfiguration 注解会被处理。Spring Boot 会通过 SpringFactoriesLoader 加载 META-INF/spring.factories 文件中定义的 EnableAutoConfiguration 配置项。

  3. 加载自动配置类SpringFactoriesLoader 会从 spring.factories 文件中读取 EnableAutoConfiguration 配置项,并将这些配置类加载到 Spring 容器中。这些配置类通常是一些 @Configuration 类,它们定义了如何自动配置 Spring 应用程序。

  4. 应用自动配置 :加载的自动配置类会根据项目的依赖和配置,自动配置 Spring 应用程序。例如,如果项目中引入了 spring-boot-starter-web 依赖,Spring Boot 会自动配置 Tomcat 和 Spring MVC。

3.2 示例

假设我们有一个自定义的自动配置类 MyAutoConfiguration,它位于 com.example 包中。为了让 Spring Boot 能够自动加载这个配置类,我们需要在 META-INF/spring.factories 文件中添加以下配置:

properties 复制代码
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.MyAutoConfiguration

当 Spring Boot 应用程序启动时,SpringFactoriesLoader 会读取这个文件,并将 MyAutoConfiguration 类加载到 Spring 容器中。MyAutoConfiguration 类中定义的 Bean 将会被自动注册到 Spring 容器中。

java 复制代码
@Configuration
public class MyAutoConfiguration {
    @Bean
    public MyService myService() {
        return new MyService();
    }
}

4. 多个需要被注入的类的配置

在实际开发中,我们可能会有多个自动配置类需要被加载到 Spring 容器中。此时,我们可以在 spring.factories 文件中配置多个类,用逗号分隔即可。

4.1 配置多个自动配置类

假设我们有两个自动配置类:MyAutoConfigurationAnotherAutoConfiguration,它们分别位于 com.example 包中。我们可以在 spring.factories 文件中这样配置:

properties 复制代码
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.MyAutoConfiguration,\
com.example.AnotherAutoConfiguration

4.2 示例代码

MyAutoConfiguration
java 复制代码
@Configuration
public class MyAutoConfiguration {
    @Bean
    public MyService myService() {
        return new MyService();
    }
}
AnotherAutoConfiguration
java 复制代码
@Configuration
public class AnotherAutoConfiguration {
    @Bean
    public AnotherService anotherService() {
        return new AnotherService();
    }
}
spring.factories
properties 复制代码
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.MyAutoConfiguration,\
com.example.AnotherAutoConfiguration

4.3 加载顺序

Spring Boot 会按照 spring.factories 文件中配置的顺序加载自动配置类。如果需要控制加载顺序,可以使用 @AutoConfigureBefore@AutoConfigureAfter@AutoConfigureOrder 注解来指定顺序。

例如,如果我们希望 MyAutoConfigurationAnotherAutoConfiguration 之前加载,可以这样配置:

java 复制代码
@Configuration
@AutoConfigureBefore(AnotherAutoConfiguration.class)
public class MyAutoConfiguration {
    @Bean
    public MyService myService() {
        return new MyService();
    }
}

5. 总结

SpringFactoriesLoader@EnableAutoConfiguration 是 Spring Boot 自动配置机制中的两个关键组件。@EnableAutoConfiguration 注解用于启用自动配置功能,而 SpringFactoriesLoader 则负责加载和实例化 META-INF/spring.factories 文件中定义的自动配置类。通过这种机制,Spring Boot 能够根据项目的依赖自动配置 Spring 应用程序,极大地简化了开发者的配置工作。

当有多个自动配置类需要被加载时,我们可以在 spring.factories 文件中用逗号分隔多个类的全限定名。如果需要控制加载顺序,可以使用 @AutoConfigureBefore@AutoConfigureAfter@AutoConfigureOrder 注解。

理解 SpringFactoriesLoader@EnableAutoConfiguration 的关系,以及如何配置多个自动配置类,有助于我们更好地掌握 Spring Boot 的自动配置原理,并能够根据需求自定义自动配置类。

相关推荐
程序员爱钓鱼37 分钟前
Go语言中的反射机制 — 元编程技巧与注意事项
前端·后端·go
paopaokaka_luck3 小时前
基于SpringBoot+Vue的电影售票系统(协同过滤算法)
vue.js·spring boot·后端
IT_10249 小时前
Spring Boot项目开发实战销售管理系统——系统设计!
大数据·spring boot·后端
ai小鬼头10 小时前
AIStarter最新版怎么卸载AI项目?一键删除操作指南(附路径设置技巧)
前端·后端·github
Touper.10 小时前
SpringBoot -- 自动配置原理
java·spring boot·后端
一只叫煤球的猫11 小时前
普通程序员,从开发到管理岗,为什么我越升职越痛苦?
前端·后端·全栈
一只鹿鹿鹿11 小时前
信息化项目验收,软件工程评审和检查表单
大数据·人工智能·后端·智慧城市·软件工程
专注VB编程开发20年12 小时前
开机自动后台运行,在Windows服务中托管ASP.NET Core
windows·后端·asp.net
程序员岳焱12 小时前
Java 与 MySQL 性能优化:MySQL全文检索查询优化实践
后端·mysql·性能优化
一只叫煤球的猫12 小时前
手撕@Transactional!别再问事务为什么失效了!Spring-tx源码全面解析!
后端·spring·面试