1. 程式人生 > >Hybris階段總結(2)hybris架構

Hybris階段總結(2)hybris架構

年前總結一下這兩個星期在SAP實習學到的一些東西

先上圖:

從底往上總結,之後會有個小例子來解釋一下

1、Persistence layer

 就是作為hybris所連線的資料庫這一層,其中hybris支援連線mysql、oracle、sqlserver和SAP自己的HANA。但是因為hybris本身設計的原因(下一條詳述),我們並不需要對資料庫進行直接的操作。

2、Item

 準確的說並不是作為一個層,而是一種資料型別,在每個extension專案中的xxxx-item.xml中定義(之後的博文會詳述,簡單的說extension就是針對hybris中各層我們自己定義的,需要滿足個性化需求的拓展,匯入eclipse後會以一個個java project形式存在)。

 可以說item是開發者能夠接觸到的最接近底層的東西。在item裡我們使用統一的xml語言來對每種資料以及資料之間的關係進行定義,比如我們需要一個ContactRequest物件,其中有message屬性,那麼我們定義如下

  1. <itemtype 在這裡會定義很多配置屬性>

  2. <attributes>

  3. <attribute qualifier="message" type="java.lang.String">

  4. <persistence type="property"/>

  5. </attribute>

  6. </attributes>

  7. </itemtype>

 我就直接將其理解為hybris自己能夠理解的資料庫定義方法,在你將其定義好以後,在系統build的過程中(hybris使用的是ant),hybris會根據不同的資料庫方言,使用ORM等(這個之後我還要詳細查查)自動在資料庫中進行建表。

3、Service

 service指的是很細粒度的、商務上所需要的各種方法,,比如計算總價、對資料庫進行的CRUD等。在hybris已有的系統中我們會找到非常多型別的hybris介面定義。service層將資料整理好以後,會以model的形式暴露給façade層來使用,不同的service之間也通過model來傳遞資料。

4、Model

 Model是java類,與我們在item中定義的各種資料一一對應,但是我們並不需要對其進行逐個編寫,它會在hybris 進行build期間自動的生成於platform裡的gensrc資料夾中。之所以將不同的extension定義的item生成的model集中在同一個資料夾下,是因為不同model之間可能會存在互相包含關係,這樣model生成過程中如果生成一個model時裡面包含的其他extension的model class,在extension各自生成自己的model並放在自己資料夾的情況下,就會發現有未定義的class,進而導致build failure。

 之前定義的item所對應的model大致如下(還有很多其他內容,這裡只寫重點)

  1. <code class="language-html">public class ContactRequestModel extends ItemModel  
  2. {  
  3.     public final static String _TYPECODE = "ContactRequest";  
  4.     private String _message;      
  5.     public String getMessage()  
  6.     {  
  7.         //message的get方法  
  8.     }  
  9.     public void setMessage(final String value)  
  10.     {  
  11.         //message的set方法  
  12.     }  
  13. }</code>  

5、DAO

 DAO,全稱Data Access Obiect是我們自己需要編寫的一系列Java類,在hybris已有的系統中只有介面定義。其作用就是在service需要對資料庫進行類似於CRUD的操作時,就會呼叫DAO來進行,DAO會返回model來供service的使用。

6、Façade

 這一層中façade也是以各種java類存在,在hybris中也有巨量的介面可以去呼叫。在這一層中會定義一系列比較偏向“業務”方面的方法,更加粗粒度,比如向購物城中新增商品、搜尋商品等,facade接收service傳過來的model,進行處理以後回以DTO(datatransfer object)的形式上傳到client層。

7、DTO

 這是用於資料傳輸的POJO(plain old java object,不是JavaBean,EntityBean 或者SessionBean。 POJO不擔當任何特殊的角色,也不實現任何特殊的Java框架的介面),完全由你自己定義。

 DTO只用於傳輸資料,裡面除了儲存資料的各種資料型別以外就只有相對應的get與set方法。使用DTO你可以將多個不同extension中所生成的多個不同的model中的資料整合到一起,這樣會避免只是用model所帶來的各種潛在問題。

8、為何使用façade與DTO(摘自hybris使用手冊)

 之所以需要DTO,是因為在某些情況下,僅僅使用service來處理model並傳給上層client的話,service類會變得很笨重:(1)我們需要更加簡潔的資料格式來傳遞資料給client層的JSP來進行展示;(2)當我們需要將一堆物件序列化來傳輸給其他系統的時候;(3)當我們需要對不同使用者許可權進行相應限制的時候。因此我們需要一個比model更加簡化的資料表示方式,而這就是DTO。

 還有一個原因就是,不同的程序間進行通訊時,通常會是呼叫遠端介面情況,比如說web service,因此每一次請求都會耗時包括:請求傳輸時間、遠端處理時間、返回結果傳輸時間。這其中將請求傳送出去以及結果傳輸回來的時間會佔很大比重(IO傳輸時間遠大於系統內部處理時間)。因此如果將多次請求內容放在一個DTO中,則可以大大減少傳輸資訊的時間,提高系統吞吐率。

 需要façade,首先是因為我們需要生成DTO的方法與方法所在的類。並且,façade相當於為controller提供了一組更加簡潔的操作,因為service層中操作粒度過細,並且還不提供許可權控制等操作,因此façade相當於一個虛擬的中介軟體,從下層(service)中呼叫各種偏向底層的方法,自己對方法進行排列組合、加上自己的處理以後,對不同使用者暴露不同的方法與資料的呼叫。

9、Converter

 這是façade所呼叫的一種java類,作用就是將model轉化為DTO。

10、Client層

 前端所包括的一系列東西,包括但不限於MVC中的controller、web service或是個指令碼。

11、在以上所有的架構中,只有service、item、client是必須出現的,其他所有功能都是可選項

下面以一個例子來進行說明:

PS.一下所有圖中都沒有體現自動生成的model(每次還要多畫兩個物件,好煩。。。),但是有的物件中會有xxxxmodel

又PS.  因為Hybris整體採用Spring架構,所以除了程式設計以外還會有很多的.xml檔案相關的操作,這裡省略,之注重物件之間的關係

1、比如說你作為一個在SAP的實習生,現在需要使用hybris開發一個功能:在前端查詢商品資訊。

 其中由ProductModel體現,儲存商品基本資訊(注意這是個model);而ProductModel中又包含PriceModel(這也是個model),儲存幣種與幣值。

 那麼你三兩下就搞出了一個只有最基本功能的結構:

 其中ProductController就是你在前端頁面中作用到的controller(hybris會使用Spring MVC架構)。Controller會呼叫兩個service來分別獲取商品資訊與價格資訊,之後會呼叫handleRequest操作來呈現資訊。

2、 當然我們為了將service與資料庫進行解耦,會引入DAO,它會專門負責資料相關的CRUD之類的操作,改了之後變成了這樣:

 這樣service就能專注於對於model的操作(當然在這個例子裡體現不太出來),而將繁瑣的資料讀寫等操作交給了DAO來完成。

3、之後我們想到,controller直接呼叫service也不好,考慮到上面第8點所提到的各種情況,使用façade能夠體現出更加良好的程式碼結構與可擴充套件性,於是我們繼續改,成果是這樣:

 其中façade代替了service來與controller進行通訊,並且呼叫service來獲取所需要的model並轉化為controller所需要的DTO(圖中的ProductData與PriceData)

4、最後,我們建立converter來專門處理façade中的model轉化為controller的任務,這樣façade就能夠專注於處理其他更重要的操作。(因為地方實在沒有了,我略去了一直沒變的幾部分)

相關推薦

Hybris階段總結2hybris架構

年前總結一下這兩個星期在SAP實習學到的一些東西 先上圖: 從底往上總結,之後會有個小例子來解釋一下 1、Persistence layer  就是作為hybris所連線的資料庫這一層,其中hybris支援連線mysql、oracle、sqlserver和SAP自

Hybris階段總結1何為hybris

按照谷歌出來的結果,大體意思是“Hybris  Commerce是一套完善的電子商務解決方案,基於開放標準構建,功能強大,且具有模組化的特點,旨在為滿足企業的商務需求提供堅實的基礎”。 當然對於我這樣的萌新而言這解釋跟天書沒啥區別,我對HybrisCommerce的理解如下

前端學習階段總結2

引用值和原始值 上篇文章提到了引用值和原始值,今天便要花些時間來刨析一下這兩個值: 原始值: 首先,先來說一下棧,棧的特點為先入後出。採用動態一維陣列來儲存棧。所謂動態,指的是棧的大小可以根據需要增加。 原始值位於棧內,也遵循先入後出的特點。重點是:賦值為copy

企業架構研究總結19——TOGAF架構開發方法ADM之準備階段

1.1 準備階段(Preliminary) 企業架構開發方法各階段——預備階段 1.1.1 目標       預備階段的目標是: 對進行企業架構活動的組織的背景和環境進行審查。 明確企業架構的贊助人,以及其他將被建立企業架構這項業務指令所影響的主要干係人,並確定

企業架構研究總結21——TOGAF架構開發方法ADM之業務架構階段

1.3 業務架構(Business Architecture) 企業架構開發方法各階段——業務架構 1.3.1 目標 描述基線業務架構 開發基於原則、業務目標和策略驅動力的目標業務架構,描述產品和/或服務策略,以及業務環境在組織、功能、過程、資訊和地理這些方面

c++的const小總結2

通過 con 其他 綁定 strong col 指針和引用 兩個 tle c++的const小總結(1) http://www.cnblogs.com/MyNameIsPc/p/7091631.html 頂層const和底層cnost 先憑經驗區分一下兩者的區別?

軟件工程綜合實踐階段小結2

img 視圖 view app web-inf hand ont info base 這兩天,在企業導師的指導下,我們基於springmvc+mybatis+spring再次建立了之前的網站(但沒有連接數據庫)。 可以發現,結構比之前簡單了許多,事實上代碼量也小了很多

基於MVC4+EasyUI的Web開發框架經驗總結2- 使用EasyUI的樹控件構建Web界面

set 應用 get ember trim ase str zab ble http://www.cnblogs.com/wuhuacong/p/3669575.html 最近花了不少時間在重構和進一步提煉我的Web開發框架上,力求在用戶體驗和界面設計方面,和Winfor

提高組模擬賽總結2

這一 使用 從大到小 number 復雜度 題意 不能 空間 當前 T1: 題意:給定一個01背包,求將背包裝到不能再放任何剩余物品的方案數 做法:部分分 F[j][k]表示前i個物品分配j空間,最小沒有使用的物品為k的方案數 F[j][k] = Max(F[j-w[i]]

MEF學習總結1---總體架構

attr 總結 技術分享 dir target get gre round 管理 用了很久的MEF框架來做依賴註入,最近想把它的原理和機構總結一下,主要包括如下幾個方面: 1. 總體架構 2. .Net Composition Primitive 3. Attribu

Spring學習總結2- AOP

服務 win align schema 可重用性 ext 4.0 art 屬性表 一,什麽是AOP AOP(Aspect Oriented Programming)意為:面向切面編程,通過預編譯方式和運行期動態代理實現程序功能的統一維護的一種技術。AOP是OOP的延續,

SSM框架搭建總結2

jdk bsp jdk安裝 搭建 參考 module 詳情 .cn ace 一、開發環境搭建 1、本地jdk安裝及配置環境變量 2、本地tomcat安裝 3、本地maven安裝 3.1 maven安裝 3.2 maven數據倉庫配置settings.xml 4、本地安裝

【數據結構】ArrayList原理及實現學習總結2

!= 需要 但是 object count def 原理 arrays 位置 ArrayList是一個基於數組實現的鏈表(List),這一點可以從源碼中看出: transient Object[] elementData; // non-private to si

Linux 階段練習2

Linux階段練習(2)67、顯示CentOS7上所有系統用戶的用戶名和UID # cat /etc/passwd |grep '.*:x:\<[2-9][0-9][1-9]\>.*'68、添加用戶bash、testbash、basher、sh、nologin(其shell為/s

OpenCV學習總結2- 視覺系統的構成要素

mic clas 學習 family 描述 計算機 opencv ati enc 相機將光源中的場景轉換成圖像,計算機視覺系統對圖像進行描述。 照明設備:光源成像設備:相機處理設備:主機算法軟件:視覺處理系統OpenCV學習總結(2)- 視覺系統的構成要素

操作系統常考知識點總結2

實現 共享資源 雙工 msu 空間 線程 有一個 col 生成 進程間通信(IPC)方式 1.管道(pipe) 2.信號(signal) 3.消息隊列 4.共享內存 5.信號量 6.套接字(socket) 管道 無名管道有如下特點: 1、半雙工,數據在同一時刻只能在一個方

Git:git-checkout的用法總結2

參考 正文 nsa dex block -o onf script 還需要 原帖收藏於IT老兵驛站,傳遞一個IT老兵在雕零前的光和氧。 前言 結合前一篇文章,再認真總結一下git-checkout的用法,因為可能一次總結到不了位,那麽就不怕啰嗦,不怕重復,多總結幾次,這樣可

面試總結2—— 字符串

esp r++ set cout help c++ inpu ++ col 收集一些關於字符串的面試筆試題。 1. 逆序字符串 思路:原地逆序,將字符串兩邊的字符逐個交換。例如,給定字符串“abcd”,逆序的過程分別是交換字符a和d,交換字符b和c。 實現1):通過指針

學習BeetlSQL總結2——查詢API,更新API

reat sel RoCE bee 批量 pub 輸出 刪除 ras 學習BeetlSQL總結(2)經過上節的學習,我們已經了解了BeetlSQL的基礎,接下來我們深入的學習BeetlSQL一.BeetlSQL說明1.獲得SQLManager是系統的核心,它提供了所有的da

Spring-batch學習總結2—Job,Flow創建及應用,多線程並發,決策器,監聽器,參數

class getname current ces 表達式 .get been ant string 一.Job的創建及其應用1.Job flow的介紹:(1)狀態機:例完成step1,是否繼續完成step2,step3,我們就需要通過Job flow來控制(2)進行演示: