扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
<!-- 规则引擎处理器 -->
<bean id="SharkysExpressLoansApplicationProcessor" class="SpringRuleEngine">
<property name="firstStep">
<ref bean="ValidApplicationRule"/>
</property>
</bean>
这个Bean简单地指明ValidApplicationRule为业务处理的第一个步骤。这个组件如下定义:
<!-- validation -->
<bean id="ValidApplicationRule" class="ValidApplicationRule">
<property name="positiveOutcomeStep">
<ref bean="ValidStateRule"/>
</property>
<property name="negativeOutcomeStep">
<ref bean="RejectionAction"></ref>
</property>
</bean>
你可以看到,规则自身也在Spring上下文中定义:如果贷款申请是合法的,应用会检查是否正确的州;否则控制传递给RejectionAction。
RejectionAction也很简单:
public class ProcessRejectionAction extends AbstractPersistenceAwareAction {
protected void doExecute(Object arg) throws Exception {
LoanApplication application = (LoanApplication) arg;
if(LoanApplication.INSUFFICIENT_DATA.equals(application.getStatus()))
this.getPersistenceService().recordIncomplete(application);
else
this.getPersistenceService().recordRejection(application);
}
}
它在Spring上下文中如下定义(注意引用了被伪类欺骗的持久服务):
<!-- rejection -->
<bean id="RejectionAction" class="ProcessRejectionAction">
<property name="persistenceService">
<ref bean="LoanApplicationPersistenceService"/>
</property>
</bean>
<!-- persistence service -->
<bean id="LoanApplicationPersistenceService" class="MockLoanApplicationPersistence"/>
我们的下一个业务规则检查是否贷款申请来自合法的州:
public class ValidStateRule extends AbstractRule {
private List validStates;
protected boolean makeDecision(Object arg) throws Exception {
LoanApplication application = (LoanApplication) arg;
if(validStates.contains(application.getStateCode())) {
return true;
}
application.setStatus(LoanApplication.INVALID_STATE);
return false;
}
public void setValidStates(List validStates) {
this.validStates = validStates;
}
}
有趣的是,我们的代码并不知道哪些州是合法的。这些业务信息由上下文来定义:
<!-- check valid state -->
<bean id="ValidStateRule" class="ValidStateRule">
<property name="validStates">
<list>
<value>TX</value>
<value>MI</value>
</list>
</property>
<property name="positiveOutcomeStep">
<ref bean="ValidIncomeExpenseRatioRule"/>
</property>
<property name="negativeOutcomeStep">
<ref bean="RejectionAction"></ref>
</property>
</bean>
Spring的内建功能再一次让我们从代码中抽取出逻辑流程和参数数据,仅在外部配置就可以了。
如你所见,Spring应用容器为我们的类提供了所有必须的绑定。在启动时,Spring创建所有必须的对象并设置相关的依赖。在运行时,我们的业务规则通过定义在Spring上下文而不是代码中的逻辑和参数数据来执行。
贷款申请示例的其他部分可以用相同方法来配置和开发。完整的源程序及对应的Spring配置可以在资源中找到。
总结
在这篇文章中,我演示了通过Spring帮助你开发基于规则应用的众多方法中的一部分。你也可以使用其内置的AOP来支持在你的规则和操作中混合日志及事务代码而不会污染你先前的业务逻辑。
SPRING应用上下文是可以重新加载的。应用可以修改业务规则和参数(通过修改XML文件)并在运行中重新加载上下文。想象这么做的GUI应用。这么做可以提供与价格为数百万的商业的规则引擎系统的类似功能。
很期望这篇文章可以帮助你尝试一些新鲜而以令人振奋的方法来使你的代码在将来更加有效。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者