以下是Spring Boot自定义Starter的完整实现指南,结合最佳实践与核心原理:
一、核心概念
-
Starter本质
将功能模块的依赖、配置、自动装配逻辑封装为可复用的JAR包,遵循"约定大于配置"原则56。- 作用:简化依赖管理,避免手动配置(如MyBatis Starter自动配置SqlSessionFactory)。
- 命名规范:
xxx-spring-boot-starter
(第三方jar)或spring-boot-starter-xxx
(spring官方jar)。
-
关键组件
- 自动配置类:通过
@Conditional
系列注解实现条件装配; - 属性配置类:绑定
application.yml
中的自定义参数; spring.factories
:注册自动配置类到Spring容器;
- 自动配置类:通过
二、实现步骤(以自定义数据脱敏Starter为例)
1. demo-spring-boot-starter/pom.xml
<!-- demo-spring-boot-starter/pom.xml -->
<!-- 必须包含spring-boot-starter基础依赖 -->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!-- 可选:添加Lombok简化代码 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
2. com.example.DesensitizeProperties
@Data // lombok 生成getter setter 方法
@ConfigurationProperties(prefix = "desensitize")
public class DesensitizeProperties {
private String pattern = "\\d{4}"; // 默认匹配4位数字
private String replacement = "****";
}
3. com.example.DesensitizeAutoConfiguration
@Configuration // IOC
@EnableConfigurationProperties(DesensitizeProperties.class) // 开启配置文件中的参数接收
//@ConditionalOnClass(DesensitizeService.class) // 指定类时开启注解
public class DesensitizeAutoConfiguration {
@Bean //创建Bean对象,交由spring管理
//@ConditionalOnMissingBean //条件注解,用于在只有当Spring容器中不存在某个Bean时,才创建该Bean。常用于自动配置和模块化设计中,允许开发者在需要时提供自定义实现,同时保留默认实现作为兜底方案
public DesensitizeService desensitizeService(DesensitizeProperties props) {
return new DesensitizeService(props);
}
}
4. 使用
其他项目引用:
<dependency>
<groupId>com.example</groupId>
<artifactId>demo-spring-boot-starter</artifactId>
<version>1.0.0</version>
</dependency>
其他项目yaml配置:
desensitize:
pattern: "\d{3}"
replacement: "###"
方式一:约定大于配置方式,在demo-spring-boot-starter的META-INF里 ,约定在此文件下带有默认名称的文件中的class交由spring管理
SpringBoot2项目,resources/META-INF/spring.factories
其中spring.factories是文件名称
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.DesensitizeAutoConfiguration
SpringBoot3项目,resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
其中org.springframework.boot.autoconfigure.AutoConfiguration.imports是文件名称
com.example.DesensitizeAutoConfiguration
防止项目存在的兼容性问题,建议2个都进行配置。
方式二:采用Import方式配置
在启动类上添加@Import(DesensitizeAutoConfiguration.class)
方式三:采用自定义注解方式
添加Importselector实现
import org.springframework.context.annotation.ImportSelector;
import org.springframework.core.type.AnnotationMetadata;
public class MyInport implements Importselector {
public string[] selectImports(AnnotationMetadata importingClassMetadata){
return new string[]{DesensitizeAutoConfiguration.class.getName()
};
}
添加自定义注解
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Import(MyInport.class)
public @interface EnableUtil
在项目启动类上添加@EnableUtil注解
上述3种使用方法,建议使用第一种,引入jar开箱即用,减少侵入。
三、高级技巧
- 条件控制
使用@ConditionalOnProperty
、@ConditionalOnWebApplication
等精确控制装配条件。 - 自定义注解
通过@Import
导入配置类,实现更灵活的启用方式。 - 版本兼容
在pom.xml
中声明<dependencyManagement>
管理依赖版本。
补充说明:springboot自动装配的核心注解@Import
- 参数如果是普通类:将该类实例化交给IOC容器管理
- 参数如果是ImportBeanDefinitionRegistrar的实现类:支持手工注册bean
- 参数如果是ImportSelector的实现类:注册selectlmports返回的数组(类全路径)到I0C容器 批量注册
starter典型应用场景:日志增强、分布式锁、API签名验证等通用模块封装。通过Starter可实现企业级技术中台建设
如还有不太明白的地方,可以咨询博主哦😄