微信登录

自动配置 - 自定义自动配置 - 编写自定义配置

Java - Web - Spring 《自动配置 - 自定义自动配置 - 编写自定义配置》

一、引言

在 Spring 框架中,自动配置是一个强大的特性,它能够根据类路径中的依赖自动为应用程序配置 Bean,大大减少了开发者的配置工作量。Spring Boot 更是将自动配置发挥到了极致,提供了大量的开箱即用的自动配置。然而,在某些特定场景下,我们可能需要编写自定义的自动配置来满足业务需求。本文将详细介绍如何编写自定义的 Spring 自动配置。

二、自定义自动配置的原理

Spring 的自动配置是基于 @EnableAutoConfiguration 注解实现的,该注解会触发 Spring Boot 的自动配置机制,它会扫描 META - INF/spring.factories 文件,该文件中定义了一系列的自动配置类,Spring 会根据类路径中的依赖和配置属性来决定是否加载这些自动配置类。

自定义自动配置的核心步骤如下:

  1. 创建配置类,使用 @Configuration 注解标记。
  2. 根据条件使用 @Conditional 系列注解来控制配置类的加载。
  3. META - INF/spring.factories 文件中注册自动配置类。

三、编写自定义配置的示例

1. 创建 Maven 项目

首先,创建一个新的 Maven 项目,添加 Spring Boot 的依赖:

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter</artifactId>
  5. <version>2.7.5</version>
  6. </dependency>
  7. </dependencies>

2. 定义配置属性类

创建一个配置属性类,用于绑定配置文件中的属性:

  1. import org.springframework.boot.context.properties.ConfigurationProperties;
  2. @ConfigurationProperties(prefix = "custom.config")
  3. public class CustomConfigProperties {
  4. private String message;
  5. public String getMessage() {
  6. return message;
  7. }
  8. public void setMessage(String message) {
  9. this.message = message;
  10. }
  11. }

3. 创建服务类

创建一个简单的服务类,使用配置属性类中的属性:

  1. public class CustomService {
  2. private final String message;
  3. public CustomService(String message) {
  4. this.message = message;
  5. }
  6. public String getMessage() {
  7. return message;
  8. }
  9. }

4. 创建自动配置类

创建一个自动配置类,使用 @Configuration@EnableConfigurationProperties 注解:

  1. import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
  2. import org.springframework.boot.context.properties.EnableConfigurationProperties;
  3. import org.springframework.context.annotation.Bean;
  4. import org.springframework.context.annotation.Configuration;
  5. @Configuration
  6. @ConditionalOnClass(CustomService.class)
  7. @EnableConfigurationProperties(CustomConfigProperties.class)
  8. public class CustomAutoConfiguration {
  9. @Bean
  10. public CustomService customService(CustomConfigProperties properties) {
  11. return new CustomService(properties.getMessage());
  12. }
  13. }

在上述代码中,@ConditionalOnClass(CustomService.class) 表示只有当类路径中存在 CustomService 类时,才会加载该配置类。@EnableConfigurationProperties(CustomConfigProperties.class) 用于启用配置属性类。

5. 注册自动配置类

src/main/resources 目录下创建 META - INF/spring.factories 文件,内容如下:

  1. org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  2. com.example.CustomAutoConfiguration

6. 使用自定义自动配置

创建一个 Spring Boot 应用程序,在 application.properties 文件中添加自定义配置属性:

  1. custom.config.message=Hello, Custom Auto Configuration!

创建主应用类:

  1. import org.springframework.beans.factory.annotation.Autowired;
  2. import org.springframework.boot.CommandLineRunner;
  3. import org.springframework.boot.SpringApplication;
  4. import org.springframework.boot.autoconfigure.SpringBootApplication;
  5. @SpringBootApplication
  6. public class CustomAutoConfigApplication implements CommandLineRunner {
  7. @Autowired
  8. private CustomService customService;
  9. public static void main(String[] args) {
  10. SpringApplication.run(CustomAutoConfigApplication.class, args);
  11. }
  12. @Override
  13. public void run(String... args) throws Exception {
  14. System.out.println(customService.getMessage());
  15. }
  16. }

四、代码解释

  • 配置属性类CustomConfigProperties 类用于绑定配置文件中的属性,通过 @ConfigurationProperties 注解指定属性的前缀。
  • 服务类CustomService 类是一个简单的服务类,接收配置属性类中的属性。
  • 自动配置类CustomAutoConfiguration 类使用 @Configuration 注解标记为配置类,@ConditionalOnClass 注解控制配置类的加载条件,@EnableConfigurationProperties 注解启用配置属性类。在该类中,通过 @Bean 注解创建 CustomService 的 Bean。
  • 注册自动配置类:在 spring.factories 文件中注册自动配置类,让 Spring Boot 能够扫描到该配置类。
  • 使用自定义自动配置:在主应用类中,通过 @Autowired 注解注入 CustomService Bean,并在 CommandLineRunner 中打印消息。

五、总结

步骤 说明
创建配置属性类 使用 @ConfigurationProperties 注解绑定配置文件中的属性
创建服务类 根据业务需求创建服务类
创建自动配置类 使用 @Configuration@Conditional 系列注解和 @EnableConfigurationProperties 注解创建自动配置类
注册自动配置类 META - INF/spring.factories 文件中注册自动配置类
使用自定义自动配置 在 Spring Boot 应用程序中使用自定义自动配置

通过以上步骤,我们可以编写自定义的 Spring 自动配置,提高代码的可复用性和可维护性。希望本文对你理解和编写自定义自动配置有所帮助。

自动配置 - 自定义自动配置 - 编写自定义配置