亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

基于SPRING的應用增加簡單規則引擎

2019-11-18 13:00:21
字體:
來源:轉載
供稿:網友

  摘要
  
  這篇文章解釋了在J2EE應用中規則引擎及聲明性業務邏輯的優點,并且描述如何為流行的SPRing框架開發簡單的規則引擎。此文需要讀者對Spring有基本的了解。
  
  任何大一點的軟件項目都包含了許多叫做業務邏輯的東西。業務邏輯的準確描述還是有爭議的。在為典型應用軟件的生成的大量代碼中,到處都是為如訂單處理、武器控制系統、圖形繪制等功能工作的零碎代碼。這些代碼與其他如處理持久化、日志、事務、語言偏好、框架特性及其他現代企業級應用有明顯不同。
  
  業務邏輯通常與其他代碼塊緊密的混和在一起。當重量級的侵入式框架(如EJB)被使用時,區別業務邏輯與框架生成的代碼就變得非常困難。
  
  有一個軟件需求在需求定義文檔很難準確描述,卻擁有使軟件項目成功或失敗的能力:適應性,這是用來衡量軟件響應業務變更輕易程度的標準。
  
  現代企業要求響應快速及靈活,他們對企業軟件也有同樣的要求??赡苣憬裉煨羷趯崿F的業務規則在明天就被廢棄了而且要求你根據變更快速而準確的改變。當你的包含業務邏輯的代碼隱藏在大量其他代碼中時,修改就變得緩慢、痛若且易出錯了。
  
  在今天的企業級軟件中沒有奇跡,比較流行的是規則引擎和各種業務過程治理(BPM)系統。假如你看一下市場上的宣傳,這類工具都承諾一件事:保存在倉庫中的捕捉業務邏輯的圣杯能夠清楚的分離且由自己維護,并隨時預備讓你現有的應用來調用。
  
  雖然商業的規則引擎和BPM系統有許多優點,但也有不少缺點。最大的缺點就是價格,通常很輕易就達到7位數。另一個就是除了主要的行業規范和眾多記在紙上的標準外缺乏事實上的標準。而且隨著越來越多的軟件項目采用靈敏、輕量級的快速開發方法,這些重量級的工具變得不符合潮流了。
  
  在這篇文章中,我們建立了一個簡單的規則引擎,一方面平衡系統與業務邏輯的分離,另一方面由于他基于目前流行的強大的J2EE框架因而不需要承受商業軟件的復雜性與不協調性。
  
  J2EE世界中的Spring時代
  
  在企業級軟件的復雜性變得不能忍受及業務邏輯問題越來越重要時,Spring及類似的框架產生了。可以斷定Spring在以后很長一段時間內是企業級java中的佼佼者。Spring提供了很多工具及少量代碼約定使J2EE的開發更面向對象,更輕易也更有趣。
  
  Spring的核心是IoC原則,這是一個奇異而超負荷的名字,但包含下面的簡單想法:
  
  ●功能代碼需要分開到更小的可治理片斷
  ●這些片斷是簡單的,標準的JavaBean(簡單的Java類擁有但不包含全部的JavaBean規范)
  ●你不需要參與治理這些Bean(如創建、銷毀、設置依靠)
  ●相反Spring容器通過上下文定義來為你做這些(通常為xml文件格式)
  
  Spring也提供了很多其他特性,如完整而強大的MVC框架,簡便的JDBC開發包裝及其他框架。但那些主題已經超出這篇幅文章的討論范圍。
  
  在我描述需要什么來創建基于SPRING應用的簡單規則引擎之前,讓我們想一下為什么這是一種好的想法。
  
  規則引擎設計有兩點有趣的特性使其更有價值:
  
  ●首先,從應用領域分離了業務邏輯代碼。
  ●其次,可配置性意味著業務規則的定義及其使用的順序被存儲在應用的外部,這樣就可以由規則創建人員來控制而不是應用的使用者或者開發人員了。
  
  Spring為規則引擎提供了一個好的方法。一個良好編碼的Spring應用的強組件化的設計會使你的代碼變成更小的、可治理的分散片斷,這樣就更易在Spring的上下文定義中配置。
  
  繼續了解在規則引擎設計的需求與Spring設計提供的功能之間的結合點。
  
  基于Spring的規則引擎的設計
  
  我們在Spring控制的JavaBean基礎上開始設計,這里我們叫做規則引擎組件。我們來定義下面兩種我們可能需要的組件類型:
  
  ●操作—在應用邏輯中確定用來做什么的組件
  ●規則—在一系列行為的邏輯流中做出決定的組件
  
  我們都是面向對象設計的追隨者,下面的基類建立了所有我們的組件需要通過參數被其他組件調用的基本功能:
  
  public abstract class AbstractComponent {  public abstract void execute(Object arg) throws Exception; }
  
  當然基類是抽象的因為我們根本不需要這樣的實例。
  
  AbstractAction的代碼擴展了基類來實現其他具體的操作:
  
  public abstract class AbstractAction extends AbstractComponent {  private AbstractComponent nextStep;   public void execute(Object arg) throws Exception {   this.doExecute(arg);   if(nextStep != null)     nextStep.execute(arg);  }   protected abstract void doExecute(Object arg) throws Exception;  public void setNextStep(AbstractComponent nextStep) {   this.nextStep = nextStep;  }  public AbstractComponent getNextStep() {   return nextStep;  }}
  
  你可以看到,AbstractAction做兩件事:首先他保存在規則引擎中被激活的下一個組件的定義;其次在他的execute()方法中,調用被具體類實現的doExecute()方法,在doExecute()返回后,假如存在下一個組件則調用他。
  
  我們的AbstractRule也相當簡單:
  
  public abstract class AbstractRule extends AbstractComponent {  private AbstractComponent positiveOutcomeStep;  private AbstractComponent negativeOutcomeStep;   public void execute(Object arg) throws Exception {   boolean outcome = makeDecision(arg);   if(outcome)     positiveOutcomeStep.execute(arg);   else     negativeOutcomeStep.execute(arg);  }  protected abstract boolean makeDecision(Object arg) throws Exception;
  
  // 為簡單起見,positiveOutcomeStep和negativeOutcomeStep 的Getters 和 setters均已省略
  
  在其execute()方法中,AbstractAction調用由子類實現的makeDecision()方法,然后根據方法的返回值,調用組件定義的肯定或否定結果的方法。
  
  在我們介紹了SpringRuleEngine類后我們的設計就基本完成了:
  
  public class SpringRuleEngine {   private AbstractComponent firstStep;   public void setFirstStep(AbstractComponent firstStep) {   this.firstStep = firstStep;  }   public void processRequest(Object arg) throws Exception {   firstStep.execute(arg);  }  }
  
  這就是我們規則引擎主類的全部:定義第一個業務邏輯中的組件及開始執行的方法。
  
  但是請稍等,在哪里綁定我們的類使之可以工作呢?下面你就可以看到如何利用Spring來幫助我們完成工作的方法了。
  
  在操作中的基于Spring的規則引擎
  
  讓我們看一下這個框架如何工作的具體實例吧。想象下面的用例:我們需要開發負責貸款申請的應用程序。我們需要滿足下面的條件:
  
  ●檢查應用的完整性否則駁回
  ●檢查應用是否來自我們授權處理業務的應用。
  ●檢查申請者的月收支比是否滿足我們的要求。
  ●輸入的申請通過我們不知道實現細節的持久服務被存儲在數據庫中,我們只知道他的接口(可能這個開發被外包到印度了)
  ●業務規則是可以改變的,這也是為什么需要規則引擎的設計了。
  
  首先,設計一個表示貸款申請的類:
  
  public class Loanapplication {   public static final String INVALID_STATE = "Sorry we are not doing business in your state";  public static final String INVALID_INCOME_EXPENSE_RATIO = "Sorry we cannot provide the loan given this expense/income ratio";  public static final String APPROVED = "Your application has been approved";  public static final String INSUFFICIENT_DATA = "You did not provide enough information on your application";  public static final String INPROGRESS = "in progress";   public static final String[] STATUSES =    new String[] {     INSUFFICIENT_DATA, INVALID_INCOME_EXPENSE_RATIO, INVALID_STATE, APPROVED, INPROGRESS   };  private String firstName;  private String lastName;  private double income;  private double expences;  private String stateCode;  private String status;   public void setStatus(String status) {   if(!Arrays.asList(STATUSES).contains(status))     throw new IllegalArgumentException("invalid status:" + status);   this.status = status;  }// 其他getters and setters已被省略}
  
  我們使用的持久服務擁有如下接口:
  
  public interface LoanApplicationPersistenceInterface {  public void recordApproval(LoanApplication application) throws Exception;  public void recordRejection(LoanApplication application) throws Exception;  public void recordIncomplete(LoanApplication application) throws Exception;}
  
  我們迅速開發一個什么也不做只是用來滿足接口約定的MockLoanApplicationPersistence類來欺騙接口。
  
  我們使用下面的SpringRuleEngine類的子類來加載Spring上下文并開始處理:
  
  public class LoanProcessRuleEngine extends SpringRuleEngine {  public

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品国产区一区二区三区在线观看| 日韩在线中文字| 日本亚洲欧洲色| 91亚洲一区精品| 九九精品在线观看| 日韩av网站导航| 日韩精品在线视频观看| 97免费在线视频| 亚洲精品电影网在线观看| 亚洲精品久久在线| 久久亚洲国产精品成人av秋霞| 国产视频精品免费播放| 欧美午夜宅男影院在线观看| 国产精品男女猛烈高潮激情| 欧美久久精品一级黑人c片| 久久九九精品99国产精品| 日韩成人av一区| 国外日韩电影在线观看| 亚洲欧洲av一区二区| 色琪琪综合男人的天堂aⅴ视频| 成人a级免费视频| 午夜精品久久久久久99热软件| 92福利视频午夜1000合集在线观看| 97人人模人人爽人人喊中文字| 久久九九热免费视频| 都市激情亚洲色图| 欧日韩不卡在线视频| 久久久精品免费视频| 91精品视频网站| 精品免费在线观看| 欧美日韩午夜视频在线观看| 亚洲无线码在线一区观看| 欧美丝袜一区二区三区| 欧美亚洲免费电影| 91在线视频成人| 国产精品视频免费在线| 一区二区三区 在线观看视| 九九视频这里只有精品| 亚洲美女免费精品视频在线观看| 亚洲va久久久噜噜噜久久天堂| 亚洲成人激情视频| 久久久免费观看| 91chinesevideo永久地址| 国产精品白嫩美女在线观看| 高清欧美性猛交xxxx黑人猛交| 亚洲福利视频免费观看| 欧美日韩亚洲一区二区| 蜜臀久久99精品久久久无需会员| 日韩欧美国产网站| 国产亚洲精品激情久久| 欧美亚州一区二区三区| 一本一道久久a久久精品逆3p| 亚洲国产精品嫩草影院久久| 亚洲成av人片在线观看香蕉| 国产精品99久久久久久白浆小说| 成人av在线天堂| 日韩精品极品在线观看播放免费视频| 国产精品主播视频| 精品在线观看国产| 国产啪精品视频| 日韩av一区在线观看| 91香蕉嫩草神马影院在线观看| 国内精品400部情侣激情| 日韩av高清不卡| 欧美高清在线观看| 久久精品精品电影网| 久久久91精品国产| 精品亚洲永久免费精品| 国产精品午夜一区二区欲梦| 亚洲国产欧美一区二区丝袜黑人| 日韩大片在线观看视频| 成人黄色免费片| 国产999在线观看| 91成人天堂久久成人| 69精品小视频| 中文字幕日韩在线观看| 日韩经典中文字幕| www.亚洲一区| 日韩在线视频二区| 91视频九色网站| 久久av红桃一区二区小说| 亚洲精品色婷婷福利天堂| 成人在线一区二区| 国产精品一区二区久久久| 国产欧美久久久久久| 久久人人爽国产| 69av在线视频| 日韩av一区在线观看| 国产狼人综合免费视频| 国产精品久久久久7777婷婷| 日韩精品免费看| 欧美美女18p| 国产一区深夜福利| 久久成人免费视频| 国产美女搞久久| 久久中文字幕在线| 成人免费观看a| 91中文字幕一区| 国产91精品久久久久久久| 国产有码在线一区二区视频| 在线观看欧美日韩国产| 欧美日韩国产综合视频在线观看中文| 精品亚洲精品福利线在观看| 欧美色xxxx| 亚洲高清色综合| 亚洲美女av电影| 欧美夫妻性视频| 91av网站在线播放| 欧美有码在线视频| 91极品女神在线| 国产精品偷伦一区二区| 亚洲在线视频观看| 国产成人自拍视频在线观看| 欧美高清一级大片| 91免费在线视频网站| 国产免费亚洲高清| 亚洲欧美日韩网| 精品国产依人香蕉在线精品| 美女国内精品自产拍在线播放| 日韩av中文字幕在线免费观看| 69久久夜色精品国产69| 国产在线精品成人一区二区三区| 69av视频在线播放| 色综合久久久久久中文网| 欧美影院在线播放| 92福利视频午夜1000合集在线观看| 日韩**中文字幕毛片| 久久影院免费观看| 26uuu另类亚洲欧美日本老年| 久久中文字幕在线视频| 日韩成人av一区| 久久在精品线影院精品国产| 久久网福利资源网站| 岛国av午夜精品| 91精品国产成人| 欧美精品成人在线| 亚洲精品久久久久久久久久久| 2019国产精品自在线拍国产不卡| 色av吧综合网| 琪琪第一精品导航| 国产精品一区二区三区久久| 久久99精品久久久久久琪琪| 国产精品xxxxx| 国产成人精品免高潮在线观看| 这里只有精品视频在线| 98视频在线噜噜噜国产| 亚洲国产日韩欧美在线99| 日韩最新中文字幕电影免费看| 亚洲国产91精品在线观看| 亚洲人精品午夜在线观看| 日韩在线播放视频| 亚洲午夜久久久久久久| 国内精品在线一区| 亲子乱一区二区三区电影| 久久精品福利视频| 91中文精品字幕在线视频| 国产在线精品自拍| 久久久亚洲天堂| 亚洲美女自拍视频| 精品亚洲aⅴ在线观看| 亚洲精品美女久久久久| 欧美—级a级欧美特级ar全黄| 欧美与欧洲交xxxx免费观看| 中文字幕亚洲激情|