SpringBoot自动装配-自定义自动装配

SpringBoot在引入第三方jar包后,并不需要手动注入Bean就可以直接使用依赖中的各种Bean,是因为根据约定大于配置,利用Spring的SPI机制,在第三方jar包里META-INF/spring.factories中声明了自动配置类,SpringBoot项目启动时,会由@EnableAutoConfiguration注解完成自动配置类的加载。

我们也可以通过自定义自动装配,封装一些通用的配置和功能,然后以 Starter 的形式供其他项目使用,提升开发效率。

步骤 1:创建 Maven 项目

首先,创建一个新的 Maven 项目,该项目会作为自定义 Starter 的基础。在pom.xml中添加必要的依赖:

<dependencies>
    <!-- Spring Boot 自动配置 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-autoconfigure</artifactId>
        <version>3.2.3</version>
    </dependency>
    <!-- Spring Boot 启动器 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
        <version>3.2.3</version>
    </dependency>
</dependencies>

步骤 2:定义配置属性类

定义一个配置属性类,用于绑定应用配置文件(如application.propertiesapplication.yml)中的属性。示例如下:

@Data
@ConfigurationProperties(prefix = "myconfiguration.userdef.model") // 和springboot yml文件配置项进行绑定
public class UserDefProperties {
    private String userName = "original";
    private Integer age = 18;
}

在上述代码中,@ConfigurationProperties注解的prefix属性表明了配置文件中属性的前缀,这里是myconfiguration.userdef.model

步骤 3:创建服务类

创建一个服务类,用于实现具体的业务逻辑,比如接收配置属性。示例如下:

@Data
@ToString
public class UserService {
    private String userName;
    private Integer age;
}

步骤 4:创建自动配置类

创建一个自动配置类,在这个类中把服务类注册为 Spring Bean,并且根据配置属性进行初始化。示例如下:

@Slf4j
@Configuration   // 单独声明了一个配置类
@EnableConfigurationProperties(value = UserDefProperties.class) // UserDefProperties交给ioc容器管理
public class MyAutoConfiguration {
    @Autowired
    private UserDefProperties userDefProperties;

    @Bean  // 装配
    @ConditionalOnMissingBean
    public UserService userService() {
        log.info("自定义自动装配MyAutoConfiguration.....");
        UserService userService = new UserService();
        userService.setUserName(userDefProperties.getUserName());
        userService.setAge(userDefProperties.getAge());
        log.info("user:" + userService);
        return userService;
    }
}

在上述代码中,@Configuration注解将该类标记为配置类,@EnableConfigurationProperties注解启用配置属性类,@ConditionalOnMissingBean注解表示只有在容器中不存在UserService Bean 时才会创建该 Bean。

步骤 5:创建spring.factories文件

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

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.practice.provider.autoconfig.MyAutoConfiguration

这里的com.practice.provider.autoconfig.MyAutoConfiguration需要替换为实际的自动配置类的全限定名。

步骤 6:打包和使用

将自定义 Starter 项目打包成 JAR 文件,然后在其他 Spring Boot 项目的pom.xml中添加依赖:

        <dependency>
            <groupId>com.example</groupId>
            <artifactId>provider</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

在其他项目的配置文件(如application.properties)中可以配置自定义属性:

myconfiguration:
  userdef:
    model:
      user-name: jack
      age: 20

之后,就能够在其他项目中注入UserService Bean 并使用了:

@RestController
public class Controller {
    @Autowired
    UserService userService;

    @GetMapping("/test")
    public UserService getUser() {
        return userService;
    }
}

启动其他项目,会在日志中打印jar包中加载的配置项

2025-04-01 20:20:50.931  INFO 42192 --- [           main] com.example.ConsumerApplication          : Starting ConsumerApplication using Java 1.8.0_251 on LAPTOP-6SL0R8AR with PID 42192 (D:\Code\practice\consumer\target\classes started by ck in D:\Code\practice)
2025-04-01 20:20:50.933  INFO 42192 --- [           main] com.example.ConsumerApplication          : No active profile set, falling back to 1 default profile: "default"
2025-04-01 20:20:51.427  INFO 42192 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
2025-04-01 20:20:51.431  INFO 42192 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2025-04-01 20:20:51.431  INFO 42192 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.83]
2025-04-01 20:20:51.519  INFO 42192 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2025-04-01 20:20:51.520  INFO 42192 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 562 ms
2025-04-01 20:20:51.550  INFO 42192 --- [           main] c.p.p.autoconfig.MyAutoConfiguration     : 自定义自动装配MyAutoConfiguration.....
2025-04-01 20:20:51.550  INFO 42192 --- [           main] c.p.p.autoconfig.MyAutoConfiguration     : user:UserService(userName=jack, age=20)
2025-04-01 20:20:51.718  INFO 42192 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2025-04-01 20:20:51.723  INFO 42192 --- [           main] com.example.ConsumerApplication          : Started ConsumerApplication in 1.07 seconds (JVM running for 1.597)

通过以上步骤,就完成了一个简单的 Spring Boot 自定义自动装配 Starter 的开发。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值