Spring中如何通过配置类管理多接口实现(无需修改实现类)
解决方案:通过注解+配置类解耦验证器与分组接口
可以通过自定义分组注解 + 配置类动态收集的方式,完全解耦验证器实现类与各业务验证分组(原ValidationLogicA/B/C)的关联,无需修改实现类的implements声明,仅通过配置或注解调整分组关系。
步骤1:定义分组标记注解
先创建一个自定义注解,用于标记验证器所属的业务分组,替代原有的接口继承关系:
import java.lang.annotation.*; @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Component // 让标记的类自动成为Spring Bean public @interface ValidationGroup { // 推荐用枚举替代字符串避免硬编码,这里用字符串做示例 String[] value(); }
步骤2:改造验证器实现类
移除原有的ValidationLogicA/B/C接口实现,仅保留基础Validation接口,通过注解指定所属分组:
public interface Validation { boolean validate(); } @ValidationGroup({"A", "B"}) public class ValidatorOne implements Validation { @Override public boolean validate() { // 业务逻辑 return true; } } @ValidationGroup({"A", "C"}) public class ValidatorTwo implements Validation { @Override public boolean validate() { return true; } } @ValidationGroup({"C"}) public class ValidatorThree implements Validation { @Override public boolean validate() { return true; } }
步骤3:配置类动态生成分组验证器集合
创建配置类,通过Spring上下文扫描所有标记了@ValidationGroup的Bean,按分组过滤并生成对应集合Bean:
import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; @Configuration public class ValidationGroupConfig { private final ApplicationContext applicationContext; public ValidationGroupConfig(ApplicationContext applicationContext) { this.applicationContext = applicationContext; } // 生成ValidationLogicA对应的验证器集合 @Bean public List<Validation> validationLogicA() { return getValidatorsByGroup("A"); } // 生成ValidationLogicB对应的验证器集合 @Bean public List<Validation> validationLogicB() { return getValidatorsByGroup("B"); } // 生成ValidationLogicC对应的验证器集合 @Bean public List<Validation> validationLogicC() { return getValidatorsByGroup("C"); } // 新增ValidationLogicD只需添加此Bean @Bean public List<Validation> validationLogicD() { return getValidatorsByGroup("D"); } // 通用方法:根据分组筛选验证器 private List<Validation> getValidatorsByGroup(String group) { return applicationContext.getBeansWithAnnotation(ValidationGroup.class).values().stream() .filter(validator -> { ValidationGroup annotation = validator.getClass().getAnnotation(ValidationGroup.class); return Arrays.asList(annotation.value()).contains(group); }) .collect(Collectors.toList()); } }
步骤4:调用类注入指定分组的验证器集合
通过@Qualifier指定配置类中生成的集合Bean名称,实现和原逻辑一致的注入效果:
import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Component; import java.util.List; @Component public class CallerA { private final List<Validation> validateOfA; // 通过@Qualifier指定要注入的分组集合Bean public CallerA(@Qualifier("validationLogicA") List<Validation> validateOfA) { this.validateOfA = validateOfA; } public boolean doValidate() { // 遍历执行验证逻辑 return validateOfA.stream().allMatch(Validation::validate); } }
核心优势
- 完全解耦:验证器实现类无需依赖业务分组接口,分组关系通过注解+配置维护
- 扩展性强:新增分组(如ValidationLogicD)仅需在配置类中添加对应Bean方法;调整验证器所属分组仅需修改
@ValidationGroup的参数,无需修改实现类代码 - 符合开闭原则:对扩展开放,对修改关闭,避免频繁修改实现类的继承结构
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

