spring - 弹簧和不同的方式来避免使用新的
问题描述
我使用弹簧靴2。
我需要验证许多条件,而不是创建许多 if,而是为实现 isValid 方法的每个条件创建一个类。
public interface Rulecondition<T>{
boolean isValid(){
}
public class ClientGroup implements Rulecondition<Billing>{
private Billing billing;
public ClientGroup(Billing billing){
this.billing=billing;
}
@Override
public boolean isValid(){
return true; //only for example...
}
}
我创建了一个使用所有条件流并验证一切是否有效的类
@Component
public class ConditionRuleEngine{
private List<Rulecondition> rules = new ArrayList<>();
public ConditionRuleEngine(){
}
public void addRule(Rulecondition rule){
rules.add(rule);
}
public boolean conditionApply(){
retunr rules.stream().allMatch(r->.isValid()));
}
}
在服务类中,我自动装配了 ConditionRuleEngine
@Service
public class OperationService(){
private final ConditionRuleEngine conditionRuleEngine;
@Autowired
public OperationService OperationService(final ConditionRuleEngine conditionRuleEngine){
this.conditionRuleEngine=conditionRuleEngine;
}
public void execute(Billing billing){
//need to add condition
conditionRuleEngine.run();
}
}
有没有更好的方法来添加条件然后创建一个新的?
ClientGroup cg = new ClientGroup(billing);
conditionRuleEngine.add(cg);
解决方案
是的,但是有一项更改可以帮助您解决问题:T
从Rulecondition
接口中删除泛型类型参数 ,。由于Rulecondition
只包含一个isValid
不依赖于泛型参数的方法,T
因此可以安全地删除该参数:
public interface RuleCondition {
boolean isValid();
}
删除的原因是它简化了基于 Spring 的解决方案来解决您的问题。如果没有该通用参数,您现在可以将每个RuleCondition
实现标记为@Component
(使它们有资格进行依赖注入)并将 a 自动装配List<RuleCondition>
到您的ConditionRuleEngine
类中:
@Component
public class ConditionRuleEngine {
@Autowired
private List<RuleCondition> rules;
// ...other implementation details...
}
Spring 会将所有实现的组件RuleCondition
注入该rules
领域。
虽然删除通用参数T
简化了解决方案,但它不是必需的。
如果您确实需要维护泛型参数,T
那么您可以RuleCondition
通过在类型中指定参数来自动装配每个泛型参数List
:
public interface RuleCondition<T> {
boolean isValid(T value);
}
@Component
public class ClientGroup implements RuleCondition<Billing> {
@Override
public boolean isValid(Billing value) {
// ...
}
}
@Component
public class ConditionRuleEngine {
@Autowired
private List<RuleCondition<Billing>> billingRules;
@Autowired
private List<RulecCndition<Other>> otherRules;
// ...other implementation details...
}
Spring 将注入所有RuleCondition
匹配泛型参数的对象。例如,billingRules
将包含 a List
of all RuleCondition<Billing>
(并且不会包含任何RulecCndition<Other>
对象。
推荐阅读
- c++ - 如何启用clang的模块TS?
- dask - 如何解释 Dask 可视化中的后缀数字?
- c# - 在自动化运行期间阻止光标移动
- node.js - 如何在axios中导入文件名?
- php - 如何在 php 中使用 html2canvas 中的代理在 div 中加载外部图像
- c++11 - 特征:用 unaryExpr 返回指针
- asp.net-core - Hangfire 作业未在我的 Asp .Net Core 站点上运行
- javascript - 如何在 React 中将状态数据从父级更改为子级后立即获取状态数据?
- javascript - 一些网站想在我的 chrome 中自动选择输入单选
- php - Serverload 使用带有 mail() 的自己的 postfix 与带有外部 smtp 的 phpmailer