关于Spring Boot的自动配置

目录

1.@EnableAutoConfiguration注解

2.@SpringBootConfiguration注解

3.@Import注解

4.spring.factories

5.总结

(1)@EnableAutoConfiguration

(2)AutoConfigurationImportSelector

[(3) SpringFactoriesLoader](#(3) SpringFactoriesLoader)

(4)META-INF/spring.factories

[(5) @Conditional相关注解](#(5) @Conditional相关注解)

[(6) 配置属性绑定](#(6) 配置属性绑定)

(7)自动配置类加载



在开始学习之前,先简单介绍几个关键组件:

1.@EnableAutoConfiguration注解

这是启动自动配置的主要注解,通常在主应用类上使用。它启用了Spring Boot的自动配置机制。通过这个注解,Spring Boot 可以根据所添加的依赖自动配置相应的 Beans。例如,如果类路径下有Mybatis的JAR包,MybatisAutoConfiguration注解就能根据相关参数来配置Mybatis的各个Spring Bean.
下面是一个简单的示例代码,展示了如何使用 @EnableAutoConfiguration 注解创建一个 Spring Boot 应用程序:

java 复制代码
import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication

public class DemoApplication {

        public static void main(String[] args) {

                SpringApplication.run(DemoApplication.class, args);
        }
}

在这个示例中,@SpringBootApplication 是一个组合注解,其中包含了 @EnableAutoConfiguration。因此,当在类上使用 @SpringBootApplication 时,实际上就启用了自动配置。如果只想使用 @EnableAutoConfiguration,可以这样写:

java 复制代码
import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

import org.springframework.boot.autoconfigure.EnableAutoConfiguration;

@EnableAutoConfiguration

public class DemoApplication {

        public static void main(String[] args) {

                SpringApplication.run(DemoApplication.class, args);
        }
}

在这个示例中,同样是启用了自动配置,但没有使用 @SpringBootApplication。需要注意的是:使用 @SpringBootApplication 还会启用其他的功能,例如组件扫描和配置属性。

2.@SpringBootConfiguration注解

用于指示一个类是 Spring Boot 应用的配置类。该注解实际上是@Configuration 的一个变体,并且它提供了一些额外的功能来支持 Spring Boot 的自动配置特性。

这个注解的主要作用是表明这个类是用来定义 Spring 应用上下文的 Bean 的,并且它通常用于作为 Spring Boot 应用程序的入口点。

代码示例:

java 复制代码
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@SpringBootConfiguration
public class MyAppConfiguration {

    @Bean
    public MyBean myBean() {
        // 返回MyBean的一个实例
        return new MyBean();
    }
}

3.@Import注解

该注解是 Spring 框架中的一个重要特性,允许将其他配置类或普通类导入到当前配置类中,从而利用这些类作为 Spring 上下文的一部分。这通常用于将多个配置类组织在一起,以便在需要时进行管理。

示例代码;

示例 1:导入配置类

java 复制代码
import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import org.springframework.context.annotation.Import;

@Configuration

@Import(OneConfiguration.class})

public class MainConfiguration {

   @Bean

   public String mainBean() {

      return "Bean";

   }

}

@Configuration

class OneConfiguration {

   @Bean public String oneBean() {

   return "One Bean";

   }

}

在此示例中,MainConfiguration 类通过 @Import 注解导入了 OneConfiguration 类,这样 OneConfiguration 中定义的 bean 也会被注册到 Spring 上下文中。

示例 2:导入普通类

java 复制代码
import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import org.springframework.context.annotation.Import;

@Configuration

@Import({UserService.class})

public class BootConfig {

   @Bean

   public String bootBean() {

      return "Boot Bean";

   }

}

class UserService {

   public void do() {

      System.out.println("User Service");

   }

}

4.spring.factories

是一个关键的配置文件,位于META-INF目录下。这个文件用于定义Spring Boot应用程序启动时需要加载的自动配置类。当Spring Boot应用程序启动时,@EnableAutoConfiguration注解触发自动配置,它会通过SpringFactoriesLoader类加载spring.factories文件中列出的所有自动配置类。

java 复制代码
# 自定义自动配置类
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.ape.starter.MyAutoConfiguration
java 复制代码
# 指定自动配置类,这些类将被Spring Boot的自动配置机制加载
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\
org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration,\
org.springframework.boot.autoconfigure.context.LifecycleAutoConfiguration,\
...

5.总结

Spring Boot的自动配置原理基于以下几个关键组件和步骤:

(1)@EnableAutoConfiguration

这个注解是自动配置的核心,它告诉Spring Boot根据类路径中的库和依赖来自动配置Spring应用。@EnableAutoConfiguration通过@Import引入AutoConfigurationImportSelector类,后者负责加载自动配置。

(2)AutoConfigurationImportSelector

AutoConfigurationImportSelector是一个DeferredImportSelector的实现,它会在Spring上下文的所有`@Configuration类加载完成后执行。它负责从spring.factories文件中读取自动配置类列表,并根据条件决定哪些配置类应该被加载。

(3) SpringFactoriesLoader

SpringFactoriesLoader是一个Spring框架的工具类,用于加载classpath下的`META-INF/spring.factories文件。这个文件包含了自动配置类列表,SpringFactoriesLoader`将这些类名解析为具体的类对象。

(4)META-INF/spring.factories

spring.factories文件位于每个Spring Boot自动配置模块的META-INF目录下。它定义了自动配置类,这些类是实现自动配置的Java配置类,通常使用@Configuration注解标注。

(5) @Conditional相关注解

自动配置类通常结合@Conditional相关注解使用,例如@ConditionalOnClass、@ConditionalOnBean、@ConditionalOnMissingBean、@ConditionalOnProperty等。这些条件注解控制配置类在何种条件下生效。

(6) 配置属性绑定

使用@ConfigurationProperties注解将配置文件中的属性绑定到Java Bean上,使得配置信息可以被Spring容器管理的Bean使用。

(7)自动配置类加载

Spring Boot启动时,会根据spring.factories文件中定义的自动配置类列表,结合条件注解的判断结果,动态地加载和注册Bean到Spring应用上下文中。

相关推荐
東雪木4 分钟前
Java学习——一访问修饰符(public/protected/default/private)的权限控制本质
java·开发语言·学习·java面试
helx829 分钟前
SpringBoot实战(三十二)集成 ofdrw,实现 PDF 和 OFD 的转换、SM2 签署OFD
spring boot·后端·pdf
两点王爷25 分钟前
docker 创建和使用存储卷相关内容
java·docker·容器
boonya27 分钟前
Embedding模型与向量维度动态切换完整方案
java·数据库·embedding·动态切换大模型
宁波阿成38 分钟前
族谱管理系统架构分析与亮点总结
java·系统架构·vue·ruoyi-vue·族谱
姬成韶1 小时前
BUUCTF--[RoarCTF 2019]Easy Java
java·网络安全
组合缺一1 小时前
Solon AI Harness 首次发版
java·人工智能·ai·llm·agent·solon
rOuN STAT1 小时前
Skywalking介绍,Skywalking 9.4 安装,SpringBoot集成Skywalking
spring boot·后端·skywalking
AlunYegeer1 小时前
MyBatis 传参核心:#{ } 与 ${ } 区别详解(避坑+面试重点)
java·mybatis
少许极端2 小时前
算法奇妙屋(四十)-贪心算法学习之路7
java·学习·算法·贪心算法