javascript
使用CUBA进行开发–是Spring的重大转变吗?
閱讀另一個供內(nèi)部公司使用的Web項目的要求時,您(至少是我自己)通常會看到一個很普通的集合:定義明確的數(shù)據(jù)存儲結(jié)構(gòu)(或有時是現(xiàn)有的舊式DB),大量的數(shù)據(jù)輸入形式,非常復雜的業(yè)務(wù)邏輯,報告和與許多現(xiàn)有公司系統(tǒng)的集成,從會計到供應(yīng)管理,成千上萬的并發(fā)用戶。 你首先想到的是什么?
“好的,我將使用著名的RDBMS,Hibernate / JPA + Spring Boot,添加REST API并使用我最喜歡的/最新的JS框架來實現(xiàn)UI。”
“啊。 而且我需要設(shè)置Spring Security。 也許添加一些自定義代碼以保護行級別的數(shù)據(jù)。 我將如何實施? 可能是數(shù)據(jù)庫視圖或虛擬專用數(shù)據(jù)庫。”
“以及所有這些DAO –它們相似且無聊,但我需要實現(xiàn)它們。”
“并使用ModelMapper之類的工具將JPA實體轉(zhuǎn)換為REST的DTO。”
“而且別忘了告訴約翰-我們的新實習生-懶惰獲取和JPA加入。”
“哦,我可以擺脫所有這些常規(guī)工作,而專注于關(guān)鍵的業(yè)務(wù)邏輯實現(xiàn),而不是實現(xiàn)另一種登錄表單和實體到DTO轉(zhuǎn)換嗎?”
本文適用于使用Spring框架(包括Spring Boot)從頭開始實施至少兩個項目,并且現(xiàn)在正在考慮提高生產(chǎn)力的開發(fā)人員。 在本文中,我將向您展示如何使用CUBA平臺擺脫非常常見的消磨時間的例行任務(wù)。
又是另一個框架?
開發(fā)人員聽說新框架時的第一個問題是:“當我可以使用Spring Boot并像以前一樣從頭開始實現(xiàn)所有功能時,為什么需要這么做?” 好吧,很公平–新平臺需要學習新原理并應(yīng)對新局限,而將您多年的經(jīng)驗都拋在腦后。 即使您當前的框架不夠出色,您也知道這一切,也知道它們的所有陷阱和變通辦法。
但是,如果我告訴您,CUBA不需要傳統(tǒng)的Spring開發(fā)方式的U形轉(zhuǎn)彎(或什至是直角轉(zhuǎn)彎),而是略微走了一步,就可以消除數(shù)百行DTO和DTO的樣板噪聲。轉(zhuǎn)換工具,數(shù)據(jù)分頁或數(shù)據(jù)過濾組件的實現(xiàn),為Spring Security創(chuàng)建配置文件(JPA,Cache等)。
我們將從頭開始,然后說明CUBA應(yīng)用程序開發(fā)如何遵循幾乎所有基于Spring的應(yīng)用程序所使用的模型,從而使您能夠使用在開發(fā)人員的職業(yè)生涯中學到的所有Spring功夫技能,并在結(jié)束。 本文著重于后端代碼,以使我們的故事更小,更簡潔。
Spring應(yīng)用架構(gòu)
Spring應(yīng)用程序的典型體系結(jié)構(gòu)可以輕松地搜索到,在90%的情況下,可以將其表示為具有某些跨領(lǐng)域區(qū)域的三層應(yīng)用程序。 讓我們看一下“經(jīng)典” Spring應(yīng)用程序。
域模型 –通常是手動創(chuàng)建的。 不過,有些工具可用于基于數(shù)據(jù)存儲結(jié)構(gòu)創(chuàng)建域模型。
信息庫層 –與數(shù)據(jù)存儲一起使用的類。 也稱為“ DAO”,“存儲庫”等。這是所有這些ORM框架(及其兄弟姐妹)的規(guī)則。 它通常包含僅使用域模型中的一個實體類執(zhí)行CRUD操作的類。
服務(wù)層 –有時,開發(fā)人員會創(chuàng)建一個附加層來分隔業(yè)務(wù)邏輯和數(shù)據(jù)CRUD操作。 如果您具有涉及不同類型的數(shù)據(jù)源,外部服務(wù)集成等的復雜業(yè)務(wù)邏輯,則此層很有用。
Web /控制器層 (REST / MVC)-處理REST API(將由基于瀏覽器的應(yīng)用程序使用)或使用JSP,模板框架(百葉窗,Velocity)或JVM框架(GWT, Vaadin,Wicket等)。 由于API結(jié)構(gòu)或視圖中的表示方式,通常控制器會操縱DTO而不是實體對象。 因此,開發(fā)人員通常必須在實體模型和DTO模型之間實現(xiàn)雙向轉(zhuǎn)換。
如果以上所有內(nèi)容聽起來都很熟悉(甚至對您來說就像“上尉隊長”一樣)–這是一個好兆頭,意味著您將能夠毫無障礙地開始使用CUBA。
參考應(yīng)用–寵物診所
他們說:“單詞便宜,給我看看您的代碼”。 Spring有其自己著名的“參考”應(yīng)用程序– Pet Clinic,可在GitHub上獲得 。 下面我們將展示在使用CUBA為Pet Clinic的新叉子開發(fā)后端時,如何利用Spring Developer的技能。 有一個很好的和詳細的安托萬·雷伊參考應(yīng)用程序的說明這里 ; 我們將在本文中重復一些內(nèi)容。
資料模型
該圖顯示了數(shù)據(jù)庫的ER圖。 應(yīng)用程序代碼中的實際對象域模型要復雜一些,并且包含一些繼承,您可以在上述演示文稿中找到UML。
儲存庫級別
有四個用于處理主要實體的存儲庫:所有者,寵物,訪問和獸醫(yī)。 這些存儲庫基于Spring JPA框架,并且由于Spring JPA而幾乎不包含任何代碼,但是您可以在Owner存儲庫中找到一個自定義查詢,以在一個請求中獲取所有者及其寵物。
UI屏幕
該應(yīng)用程序由九個屏幕組成,使我們可以查看所有數(shù)據(jù)并進行一些編輯:寵物主人,寵物和探訪。 我們現(xiàn)在不再討論它們,但是我需要提到的是,這些屏幕只是一個簡單的CRUD表單,對于大多數(shù)面向數(shù)據(jù)的應(yīng)用程序來說,它們是很常見的。
附加功能
除了簡單的CRUD功能外,該應(yīng)用程序還提供了一些(不是很明顯)的功能,這些功能展示了Spring Framework的強大功能:
- 緩存–獸醫(yī)列表被緩存,因此刷新獸醫(yī)列表時不會查詢數(shù)據(jù)庫。
- 驗證程序–檢查在創(chuàng)建有關(guān)寵物的新記錄期間是否填寫了所有字段。
- 格式化程序–用于正確顯示寵物類型。
- i18n –該應(yīng)用程序支持英語和德語。
- 事務(wù)管理–一些數(shù)據(jù)庫查詢被設(shè)為只讀。
旁注
我非常喜歡這張照片,因為它以100%的準確性反映了我的感受。 為了有效地使用任何框架,您需要了解其內(nèi)部工作原理。 例如,Spring Boot對您隱藏了很多東西,您會驚訝于一個簡單的JPA接口初始化后面有多少類。 有關(guān)Spring Boot Pet Clinic應(yīng)用程序中發(fā)生的“魔術(shù)”的一些說明:
- 除了@Caсheable注釋之外,沒有緩存配置代碼,但是Spring Boot以某種方式“知道”如何設(shè)置緩存實現(xiàn)(在我們的例子中為EhCache)。
- 存儲庫未標記為@Transactional(它們的父類org.springframework.data.repository.Repository也不標記),但是所有save()方法都可以在此處正常工作。
但是盡管有這些隱含的內(nèi)容,Spring Boot還是一個非常流行的框架,因為它是透明且可預(yù)測的。 它有一個非常詳細的文檔,并且是開源的,因此您可以閱讀它的工作原理并深入研究任何方法,并查看其中發(fā)生了什么。 我猜每個人都喜歡透明且易于管理的框架-使用它們可以使您的應(yīng)用程序可維護。
CUBA寵物診所
因此,讓我們看一下使用CUBA Platform的Pet Clinic實施,嘗試從我們的Spring知識角度對其進行研究,并找出可以節(jié)省一些精力的地方。
Pet Clinic實現(xiàn)的源代碼可以在GitHub上找到 。 除此之外,CUBA平臺還提供了很好的文檔 ,您可以在其中找到幾乎所有內(nèi)容(大多數(shù)情況在GitHub上通過示例和代碼片段進行了說明 )。 在本文中,我們將經(jīng)常參考該文檔,以避免重復解釋兩次。
CUBA應(yīng)用架構(gòu)
CUBA應(yīng)用程序由以下模塊組成 (請參見圖表)。
全局 –包含映射到數(shù)據(jù)庫的實體,CUBA視圖和可在其他模塊中使用的服務(wù)接口。
核心 –與應(yīng)用程序數(shù)據(jù)庫一起使用并實現(xiàn)業(yè)務(wù)邏輯的所有服務(wù)實現(xiàn)都應(yīng)放在此處。 請注意,Core類在其他模塊中不可用,其目的是為了將 Core和GUI模塊分別部署到不同的服務(wù)器,以實現(xiàn)更好的可伸縮性。 要將服務(wù)從核心模塊注入其他模塊,應(yīng)使用在全局模塊中聲明的接口。
GUI,Web,桌面,門戶 –這些模塊包含與GUI相關(guān)的類(控制器,偵聽器等),負責UI事件處理。 您可以在此處創(chuàng)建自定義REST控制器,以補充CUBA為您生成的現(xiàn)成的REST API 。
為了提高開發(fā)人員的性能,CUBA擁有Studio –一個不錯的小型GUI,用于創(chuàng)建和注冊將為您更改所有配置的實體,幫助創(chuàng)建服務(wù)的代碼存根,并具有用于GUI表單的WYSIWYG編輯器。
因此,基于CUBA平臺的應(yīng)用程序包含兩個(或多個)單獨的模塊-可以分別部署的Core和GUI,以及一個跨領(lǐng)域的Global模塊。 讓我們詳細了解CUBA的Global和Core模塊及其內(nèi)容。
全局模塊
實體模型
使用JPA兼容ORM框架和Spring的任何開發(fā)人員都應(yīng)該熟悉CUBA應(yīng)用程序中的實體模型。 它只是用@ Table,@ Entity等注釋的類,并在persistence.xml文件中注冊。
在Pet Clinic應(yīng)用程序的實體模型中,您可以重用Spring版本中的代碼,但是您需要記住以下幾點:
問題是–除了前綴和聲明性實體“字符串化”表示形式之外,CUBA還給我們帶來了什么? 其他功能包括:
- 版本化–支持實體版本。
- SoftDelete –支持實體的“軟”刪除,也稱為“邏輯”刪除。
- 可更新–添加用于實體更新日志記錄的字段。
- 可創(chuàng)建的-添加用于實體創(chuàng)建日志記錄的字段。
您可以在文檔中閱讀有關(guān)這些接口的更多信息。
在應(yīng)用程序開發(fā)期間,我只是復制了Spring版本中的現(xiàn)有實體模型,并添加了上述的CUBA特定功能,從應(yīng)用程序的參考版本中刪除了BaseEntity類。
觀看次數(shù)
CUBA的“視圖”概念可能會令人困惑,但很容易解釋。 視圖是一種聲明方式,用于指定應(yīng)提取哪些數(shù)據(jù)(屬性和嵌套實例/集合)。
假設(shè)您需要獲取所有者及其寵物或獸醫(yī)及其特殊性-以便在同一UI屏幕上顯示相關(guān)實體以及“父”數(shù)據(jù)。 如果是純Spring實現(xiàn),則需要定義JPA聯(lián)接…
@Query("SELECT owner FROM Owner owner left join fetch owner.pets WHERE owner.id =:id") public Owner findById(@Param("id") int id);…或定義適當?shù)腅AGER / LAZY提取類型,以獲取事務(wù)上下文中實體的依賴集合。
@ManyToMany(fetch = FetchType.EAGER) @JoinTable(name = "vet_specialties", joinColumns = @JoinColumn(name = "vet_id"), inverseJoinColumns = @JoinColumn(name = "specialty_id")) private Set specialties;在CUBA版本中,您可以使用EntityManager和JPQL或視圖和DataManager:
1.定義一個視圖,該視圖指定我們要提取的內(nèi)容:
<view class="com.haulmont.petclinic.entity.Vet"extends="_minimal"name="vet-specialities-view"><property name="specialities"view="_minimal"></property> </view>2.使用DataManager bean獲取此數(shù)據(jù)
public Collection findAll() {return dataManager.load(Vet.class).query("select v from cubapetclinic$Vet v").view("vet-specialities-view").list(); }您可以為不同的任務(wù)創(chuàng)建不同的視圖,從而選擇要獲取的屬性,是否獲取集合并定義對象樹的深度。 Mario David的博客中有一篇很好的關(guān)于觀點的文章 。
在寵物診所應(yīng)用程序中,我們?yōu)椴煌闆r定義了六個視圖。 這些視圖主要以UI形式使用,其中之一是-為了在服務(wù)中獲取數(shù)據(jù),代碼段如上所示。
服務(wù)接口
由于全局模塊是基于CUBA的應(yīng)用程序的跨領(lǐng)域模塊,因此您應(yīng)該在其中定義服務(wù)接口,以便能夠通過使用Spring注入來使用其他模塊中的服務(wù)。 您需要做的就是在Web模塊的“ web-spring.xml”文件中注冊服務(wù)。 CUBA平臺使用此Spring config XML文件在應(yīng)用程序模塊中創(chuàng)建代理,以進行透明的實體序列化和反序列化。 此功能使我們可以從其他模塊中調(diào)用在Core中實現(xiàn)的服務(wù),即使在分布式部署的情況下,也只需花費最少的精力即可。
因此,就使用CUBA進行實體模型開發(fā)而言,它與純Spring完全相同,但是您無需在插入后關(guān)心ID的生成和檢索實體的ID,也不必為實體的版本控制,軟刪除和創(chuàng)建額外的代碼。實體更改日志。 另外,您可以節(jié)省一些時間來創(chuàng)建視圖而不是JPA聯(lián)接。
核心模塊
核心模塊包含在全局模塊中聲明的接口的服務(wù)實現(xiàn)。 CUBA應(yīng)用程序中的每個服務(wù)通常都使用@Service進行注釋,但是您可以使用所有可用的Spring注釋來處理bean。 但是,由于CUBA的體系結(jié)構(gòu),存在一些限制:
- 如果要在Web模塊中公開服務(wù),則需要使用@Service注釋服務(wù)。
- 建議給您的服務(wù)起一個名字,以避免來自不同插件的沖突。
除此之外,您的Core模塊代碼庫是一個基于Spring的“純”后端應(yīng)用程序。 您可以像以前一樣從數(shù)據(jù)存儲中獲取數(shù)據(jù),調(diào)用第三方Web服務(wù)等。 唯一的顯著區(qū)別是與數(shù)據(jù)庫的交互。
實體管理器和數(shù)據(jù)管理器
該平臺使用其自己的EntityManager ,將其功能的一部分委托給實際的javax.persistence.EntityManager實例。 CUBA的EntityManager主要提供底層實體操作,不支持安全功能。 在大多數(shù)情況下,建議使用提供額外功能的DataManager :
有關(guān)DataManager和EntityManager的更多信息,請參見
文件 。 請注意,您不需要直接在GUI中使用這些bean –
為此的數(shù)據(jù)源 。
談?wù)揚etClinic –我(幾乎)沒有在Core模塊中編寫很多代碼,因為那里沒有復雜的業(yè)務(wù)邏輯。
CUBASpring寵物診所的特色
在上一節(jié)中,在基于Spring的Pet Clinic應(yīng)用程序中列出了其他功能,CUBA中提供了相同的功能。
快取
CUBA提供實體和查詢緩存作為內(nèi)置功能。 這些緩存在文檔中有詳細描述,應(yīng)首先考慮,因為它們支持分布式部署等所有平臺功能。 除此之外,您可以使用Spring的@Cacheable啟用緩存,并按照Spring 文檔中的說明啟用緩存。
驗證器
CUBA使用BeanValidation作為標準驗證引擎。 如果內(nèi)置驗證還不夠,則可以定義自定義驗證代碼 。 而且總是有通過描述定義Validator類來驗證UI數(shù)據(jù)的選項在這里 。
格式化程序
CUBA平臺為GUI組件提供了幾種格式化程序,但是您可以定義標準格式化程序之外的自己的格式化程序。 對于默認實體表示,使用@NamePattern批注。
I18n
CUBA平臺以與其他Java應(yīng)用程序相同的方式支持國際化 :通過使用message.properties文件,因此這里沒有新內(nèi)容。
交易管理
CUBA平臺提供以下內(nèi)容
交易管理選項:
- 熟悉Spring的@Transactional批注
- CUBA的Persistent接口,如果您在某些復雜的情況下需要細粒度的事務(wù)管理。
當我開發(fā)寵物診所時,我只考慮過一次交易-在開發(fā)允許在同一屏幕上編輯所有者,寵物和添加訪問的表格的過程中。 我需要了解何時提交事務(wù)并刷新UI以一致的方式顯示數(shù)據(jù)。
真
不到一天的時間,我就能使用“標準” CUBA UI創(chuàng)建具有與Spring Pet Pet Clinic相同功能的應(yīng)用程序。 我不會說我是CUBA的專家(距我剛開始只有幾周時間),但是我使用Spring已有很長的歷史。 讓我們看一下考慮到Spring體系結(jié)構(gòu)的基于CUBA的應(yīng)用程序:
域模型 – 全局模塊中的實體。 創(chuàng)建實體模型是眾所周知的例程。 致謝BaseIntegerIdEntity類,以節(jié)省一些ID生成時間。
信息庫層 –我不需要信息庫。 甚至沒有接口。 我剛剛使用CUBA Studio GUI創(chuàng)建了一些視圖。 使用此工具,我不需要在配置中編寫XML。 服務(wù)層 –在我們的應(yīng)用程序中,我們只有兩個服務(wù)以JSON和XML格式導出獸醫(yī),并具有可緩存的結(jié)果。 根據(jù)文檔,我將接口連接到Global ,將實現(xiàn)連接到Core 。 然后,這只是一個“正常”的開發(fā),除了稍微了解一下DataManager以便熟悉其API。 控制器層 – CUBA Pet Clinic僅包含一個自定義REST控制器,用于Web模塊中的JSON和XML提要。 毫不奇怪,這只是帶有熟悉注釋的Spring控制器。 應(yīng)用程序GUI –使用CUBA Studio創(chuàng)建“標準” CRUD表單非常容易。 我沒有考慮過將實體傳遞到Web UI和表單提交-沒有控制器和存儲庫。 CUBA為我提供了適當?shù)木W(wǎng)格和用于數(shù)據(jù)過濾的組件,因此不再需要使用Pageable解析查詢字符串和大驚小怪。 我花了大部分時間來實現(xiàn)適當?shù)腢I流程,渲染器和應(yīng)用樣式。
我的個人經(jīng)歷如下表所示:
| 易于理解和發(fā)展 | 需要閱讀文件 | |
| 實體 | 實體建模 數(shù)據(jù)庫創(chuàng)建腳本 標準基類 | 軟刪除等的附加功能 |
| 儲存庫 | 實體管理器 觀看次數(shù) | 數(shù)據(jù)管理器 |
| 服務(wù) | 豆類管理 交易管理 安全性和用戶管理 | 持久接口 |
| 控制器 | 定制REST控制器 請求URL映射 | 服務(wù)方法發(fā)布 |
| 用戶界面 | 標準表格 | 用戶界面定制 |
顯然,Pet Clinic應(yīng)用程序并未使用所有CUBA功能,可以在該站點上找到完整列表,在該站點上您將看到該平臺可以解決的其他常見任務(wù)。
我個人的觀點– CUBA簡化了后端實現(xiàn),并且如果您使用其“標準” GUI,也可以做得很好。 即使您需要精美的UI,CUBA也會確保節(jié)省您在后端開發(fā)上的時間。
缺點呢?
好吧,本節(jié)中我想提到一些事情。 這些事情并沒有改變游戲規(guī)則,但是我發(fā)現(xiàn)在熟悉CUBA的第一步中,它們是非常不必要的。
- 在引言部分中,有人說CUBA平臺帶有自己的IDE,可簡化項目的創(chuàng)建和管理。 有時在Studio和您的IDE之間切換可能會有些煩人,但是我們現(xiàn)在正在重新開發(fā)它,因此Studio很快就會轉(zhuǎn)變?yōu)镮DEA的插件。
- 在CUBA中,由于平臺提供的服務(wù)更多,因此與典型的Spring Boot應(yīng)用程序相比,我們使用更多的XML配置文件。
- 每個應(yīng)用程序的UI表單都沒有“友好” URL。 您可以使用屏幕鏈接直接訪問屏幕,但是它們不是“可讀的”。
- 您必須處理CUBA的DataManager和EntityManager并學習它們的API,而不是Spring JPA或JDBC(但仍可以在需要時使用它們)。
- 使用關(guān)系數(shù)據(jù)庫時,您將使用CUBA獲得最佳的開發(fā)性能。 與NoSQL一樣,CUBA的性能也與Spring一樣,這是相同數(shù)量的編碼工作。
結(jié)論
如果您有一項任務(wù)來實現(xiàn)將RDBMS用作數(shù)據(jù)存儲的以數(shù)據(jù)為中心的Intranet應(yīng)用程序,則可能要嘗試CUBA平臺作為基礎(chǔ),因為:
因此,通過使用CUBA,您將節(jié)省一些日常任務(wù)的時間,真正享受與復雜的業(yè)務(wù)相關(guān)算法以及與其他應(yīng)用程序的輕松集成帶來的真正樂趣。
翻譯自: https://www.javacodegeeks.com/2018/07/developing-cuba-big-shift-spring.html
總結(jié)
以上是生活随笔為你收集整理的使用CUBA进行开发–是Spring的重大转变吗?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎么去除照片上的马赛克 去除照片上的马赛
- 下一篇: apache camel_探索Apach