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