在我的 Spring 应用程序中,我有一些接口及其实现
public interface Validation(){
boolean validate();
}
public interface ValidationLogicA extend Validation(){
}
public interface ValidationLogicB extend Validation() {
}
public interface ValidationLogicC extend Validation() {
}
public class ValidatorOne implementaion ValidationLogicA, ValidationLogicB {
boolean validate(){
// do logic
};
}
public class ValidatorTwo implementaion ValidationLogicA, ValidationLogicC {
boolean validate(){
// do logic
};
}
public class ValidatorThree implementaion ValidationLogicC {
boolean validate(){
// do logic
};
}
所以上面代码的想法是:
@Component
public class CallerA {
private final List<ValidationLogicA> validateOfA;
public boolean doValidate(){
// do something
}
}
因此,通过上面的代码,将注入 ValidationLogicA 的所有实现(即 ValidatorOne 和 ValidatorTwo)来执行一些业务逻辑。 现在,如果我们有新的验证逻辑,例如 ValidationLogicD,其逻辑中也有 ValidatorOne,那么只需修改 ValidatorOne 并实现 ValidationLogicD 即可:
public class ValidatorOne implementaion ValidationLogicA, ValidationLogicB, ValidationLogicD
所以我的问题是,使用 spring bean,是否可以单独管理接口的所有实现(例如 ValidationLogicA),例如在不同的类配置中, 然后在该配置类中,我们只需添加或删除实现而不更改具体类(例如 ValidatorOne)
我正在尝试寻找另一个更好、更干净的解决方案
您可以尝试使用此解决方案。您可以使用 ValidatorOneConfig 将验证类型设置为参数,并仅调用需要的验证:
public enum ValidationType {
VALIDATION_A,
VALIDATION_B,
VALIDATION_C
}
public interface Validation {
boolean validate();
ValidationType getValidationType();
}
public abstract class ValidationLogicA implements Validation {
public ValidationType getValidationType() {
return ValidationType.VALIDATION_A;
}
}
@Getter
@Configuration
public class ValidatorOneConfig {
private List<ValidationType> validationTypes = List.of(ValidationType.VALIDATION_A, ValidationType.VALIDATION_B);
}
@Service
public class ValidatorOne {
@Autowired
private ValidatorOneConfig validatorOneConfig;
@Autowired
private List<Validation> validations;
boolean validate() {
final List<ValidationType> validationTypes = validatorOneConfig.getValidationTypes();
for (Validation validation : validations) {
if (!validationTypes.contains(validation.getValidationType())) {
continue;
}
if (!validation.validate()) {
return false;
}
}
return true;
}
}