Spring Boot 是一种基于 Spring 框架的能快速构建应用程序的框架。它通过自动配置功能简化了应用程序的开发,从而让开发人员能更加专注于业务逻辑,而不用花过多的时间去处理框架的整合和配置。
自动配置是 Spring Boot 的核心特性之一,它的目的是通过对开发人员的需求进行推断,自动配置应用程序的组件和配置。
工作原理如下:
- Spring Boot 使用了大量的自动配置类,这些类知道如何配置给定的组件;
- 在启动应用程序时,Spring Boot 会扫描类路径下的所有 jar 包,以确定哪些组件是需要自动配置的;
- 如果扫描到了某个组件,Spring Boot 就会使用自动配置来配置该组件;
- 如果开发人员需要对配置进行自定义,可以使用
application.properties或application.yml文件,或通过代码的方式进行配置 - 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 可以用自动配置简化应用程序的开发和配置。这种方式减少了配置的复杂性,加快开发的效率。