关于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应用上下文中。

相关推荐
源码宝10 分钟前
智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
java·大数据·源码·智慧工地·智能监测·智能施工
码不停蹄的玄黓38 分钟前
JUC核心解析系列(五)——执行框架(Executor Framework)深度解析
java·jvm·spring boot·spring cloud
白总Server39 分钟前
GaussDB 分布式数据库调优(架构到全链路优化)
java·网络·c++·架构·go·scala·数据库架构
import_random1 小时前
[macos]rocketmq(安装)
后端
listhi5201 小时前
k8s使用私有harbor镜像源
java·docker·kubernetes
慕木兮人可1 小时前
关于阿里云-云消息队列MQTT的连接和使用,以及SpringBoot的集成使用
spring boot·物联网·mqtt·阿里云·云计算
在未来等你1 小时前
Java并发编程实战 Day 21:分布式并发控制
java·多线程·并发编程
程序员小假1 小时前
你会不会使用 SpringBoot 整合 Flowable 快速实现工作流呢?
java·后端
来自外太空的鱼-张小张1 小时前
java将pdf文件转换为图片工具类
java·python·pdf
代码中の快捷键1 小时前
如何实现一个登录功能?
java·开发语言