#Java 框架# Spring Boot 的自动配置原理

56 阅读3分钟

Spring Boot 是一种基于 Spring 框架的能快速构建应用程序的框架。它通过自动配置功能简化了应用程序的开发,从而让开发人员能更加专注于业务逻辑,而不用花过多的时间去处理框架的整合和配置。

自动配置是 Spring Boot 的核心特性之一,它的目的是通过对开发人员的需求进行推断,自动配置应用程序的组件和配置。

工作原理如下:

  1. Spring Boot 使用了大量的自动配置类,这些类知道如何配置给定的组件;
  2. 在启动应用程序时,Spring Boot 会扫描类路径下的所有 jar 包,以确定哪些组件是需要自动配置的;
  3. 如果扫描到了某个组件,Spring Boot 就会使用自动配置来配置该组件;
  4. 如果开发人员需要对配置进行自定义,可以使用 application.propertiesapplication.yml 文件,或通过代码的方式进行配置
  5. Spring Boot 会读取开发人员的配置,并且把它们应用到对应的自动配置类中。

用代码演示自动配置

// 创建一个接口,文件名 MessageService.java
public interface MessageService{
    String getMessage();
}

// 创建一个实现该接口的类,文件名为 DefaultMessageService.java 
@Service
public class DefaultMessageService implements MessageService{
    @Override
    public String getMessage(){
        return "message from DefaultMessageService";
    }
}

// 创建一个自动配置类,文件名为 MessageServiceAutoConfig.java
/** 这个自动配置类使用 @Configuration 注解,声明这是一个配置类 **/
@Configuration
public class MessageServiceAutoConfig {

    /** 通过 @Bean 注解定义一个 bean,该bean 实现了 MessageService 接口。
        通过 @ConditionalOnMissingBean 注解,指定只有在不存在实现 MessageService 接口的 bean 时,才会创建该bean **/
    @Bean
    @ConditionalOnMissingBean(MessageService.class)
    public MessageService messageService(){
        return new DefaultMessageService();
    }
}

// 创建一个控制器,文件名为 MessageController.java
@RestController
public class MessageController {

    private final MessageService messageService;
    
    /** 通过构造器注入实现了 MessageService 接口的组件 **/
    public MessageController(MessageService messageService){
        this.messageService = messageService;
    }
    
    @GetMapping("/message")
    public String getMessage(){
        return messageService.getMessage();
    }
}


// 创建启动文件 Application.java
/** @SpringBootApplication 注解,指定这一个Spring Boot 应用程序 **/
@SpringBootApplication
public class Application{
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

Spring Boot 使用 SPI 机制实现预置的自动配置组件

SPI 是 Java 提供的一种机制,允许应用程序发现并使用提供者实现了指定接口的组件。提供者通过在其 classpath 中的一个特殊文件夹 (META-INF/services)中创建一个文件来声明它实现了哪个接口。

在 Srping Boot 中,自动配置使用了这个机制,通过向 classpath 中添加一个名为 spring.factories 的文件,来声明自动配置类。该文件定义了一个接口,以及该接口对应的自动配置类。

例如,如果你想要使用 Spring Boot 自动配置一个消息服务,你可以创建一个名为 org.springframework.boot.autoconfigure.EnableAutoConfiguration 的键,并在其中声明自己实现的自动配置类:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.autoconfig.MessageServiceAutoConfig

在你启动 Spring Boot 应用程序时,Spring Boot 会扫描 classpath 中的 META-INF/services 文件夹,并加载所声明的自动配置类。 然后,这些自动配置类会根据当前的环境和应用程序配置,配置应用程序所需的所有 bean 。

这种方式简化了配置,并使程序开发更加快速和简单。 若你需要,可以通过提供自己的配置来覆盖自动配置提供的默认配置

在 Spring Boot 中,每个自动配置类都会在启动时被自动加载,并使用 @Conditional 注解定义其被启用的条件。当所有被加载的自动配置类都检查完后,Spring Boot 会根据它们的 @Conditional 注解来决定哪些配置是可用的,并最终生成完整的应用程序上下文。

所以,通过使用 Java 的 SPI@Conditional 注解,Spring Boot 可以用自动配置简化应用程序的开发和配置。这种方式减少了配置的复杂性,加快开发的效率。