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.properties
或application.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 的开发。