Bootstrap

Spring Boot 中自动装配机制的原理

ring Boot 的自动装配机制是其核心特性之一,它能够根据项目中引入的依赖,自动配置 Spring 应用程序所需的各种 Bean,大大简化了开发人员的配置工作。下面详细介绍 Spring Boot 自动装配机制的原理。

整体流程概述

Spring Boot 自动装配机制主要通过以下几个关键步骤实现:

  1. 启动类注解触发:使用 @SpringBootApplication 注解标注启动类,该注解包含了多个重要注解,从而开启自动装配功能。
  2. 加载自动配置类:Spring Boot 通过 SpringFactoriesLoader 机制从 META - INF/spring.factories 文件中加载自动配置类。
  3. 条件注解筛选:自动配置类中使用了大量的条件注解,根据不同的条件决定是否生效。
  4. 配置 Bean 定义:当自动配置类生效后,会向 Spring 容器中注册相应的 Bean 定义。

详细原理分析

1. 启动类注解触发

在 Spring Boot 应用中,通常会使用 @SpringBootApplication 注解标注启动类,示例代码如下:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

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

@SpringBootApplication 是一个组合注解,它包含了以下三个重要注解:

  • @SpringBootConfiguration:等同于 @Configuration,用于标记该类为配置类。
  • @EnableAutoConfiguration:开启自动装配功能,这是自动装配机制的核心注解。
  • @ComponentScan:自动扫描并注册指定包下的组件。
2. 加载自动配置类

@EnableAutoConfiguration 注解通过 @Import 注解引入了 AutoConfigurationImportSelector 类,该类负责加载自动配置类。具体过程如下:

  • AutoConfigurationImportSelector 类实现了 DeferredImportSelector 接口,在 Spring 容器启动过程中,会调用其 selectImports 方法。
  • selectImports 方法会调用 SpringFactoriesLoader 类的 loadFactoryNames 方法,从 META - INF/spring.factories 文件中加载所有的自动配置类。
  • META - INF/spring.factories 文件是一个属性文件,其中定义了自动配置类的全限定名,示例如下:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration
3. 条件注解筛选

自动配置类中使用了大量的条件注解,用于根据不同的条件决定是否生效。常见的条件注解有:

  • @ConditionalOnClass:当类路径下存在指定的类时,自动配置类生效。
  • @ConditionalOnMissingClass:当类路径下不存在指定的类时,自动配置类生效。
  • @ConditionalOnBean:当 Spring 容器中存在指定的 Bean 时,自动配置类生效。
  • @ConditionalOnMissingBean:当 Spring 容器中不存在指定的 Bean 时,自动配置类生效。
  • @ConditionalOnProperty:当配置文件中存在指定的属性且值符合要求时,自动配置类生效。

示例代码如下:

@Configuration
@ConditionalOnClass(DataSource.class)
public class DataSourceAutoConfiguration {
    // 配置数据源的相关 Bean
}

上述代码表示,只有当类路径下存在 DataSource 类时,DataSourceAutoConfiguration 自动配置类才会生效。

4. 配置 Bean 定义

当自动配置类通过条件注解筛选后生效时,会向 Spring 容器中注册相应的 Bean 定义。通常在自动配置类中使用 @Bean 注解来定义 Bean,示例代码如下:

@Configuration
@ConditionalOnClass(RedisTemplate.class)
public class RedisAutoConfiguration {
    @Bean
    @ConditionalOnMissingBean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(redisConnectionFactory);
        return template;
    }
}

上述代码表示,当类路径下存在 RedisTemplate 类且 Spring 容器中不存在 RedisTemplate Bean 时,会向 Spring 容器中注册一个 RedisTemplate Bean。

总结

Spring Boot 自动装配机制通过 @SpringBootApplication 注解触发,利用 SpringFactoriesLoader 机制加载自动配置类,再通过条件注解筛选,最终将符合条件的自动配置类中的 Bean 定义注册到 Spring 容器中,从而实现了根据项目依赖自动配置 Spring 应用程序的功能。

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;