日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

cuba开发_使用CUBA进行开发–与Spring相比有很大的转变?

發(fā)布時間:2023/12/3 javascript 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 cuba开发_使用CUBA进行开发–与Spring相比有很大的转变? 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

cuba開發(fā)

閱讀另一個供內(nèi)部公司使用的Web項目的要求時,您(至少是我自己)通常會看到一個很普通的集合:定義明確的數(shù)據(jù)存儲結(jié)構(gòu)(或有時是現(xiàn)有的舊數(shù)據(jù)庫),大量的數(shù)據(jù)輸入形式,非常復(fù)雜的業(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。”

“而且別忘了告訴我們的新實習(xí)生John有關(guān)懶惰的獲取和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)所有東西時,為什么需要它?”。 好吧,很公平–新平臺需要學(xué)習(xí)新原理并應(yīng)對新局限,而將您多年的經(jīng)驗都拋在后面。 即使您當前的框架不夠出色,您也知道這一切,也知道它們的所有陷阱和變通辦法。

但是,如果我告訴您,CUBA不需要傳統(tǒng)的Spring開發(fā)方式的U形轉(zhuǎn)彎(或什至是直角轉(zhuǎn)彎),而是略微走了一步,就可以消除數(shù)百行DTO和DTO產(chǎn)生的樣板噪聲。轉(zhuǎn)換工具,數(shù)據(jù)分頁或數(shù)據(jù)過濾組件的實現(xiàn),為Spring Security創(chuàng)建配置文件(JPA,Cache等)。

我們將從頭開始,然后說明CUBA應(yīng)用程序開發(fā)如何遵循幾乎所有基于Spring的應(yīng)用程序所使用的模型,從而使您能夠使用在開發(fā)人員的職業(yè)生涯中學(xué)到的所有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ù)集成等的復(fù)雜業(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)用程序的說明這里 ; 我們將在本文中重復(fù)一些內(nèi)容。

資料模型

該圖顯示了數(shù)據(jù)庫的ER圖。 應(yīng)用程序代碼中的實際對象域模型更加復(fù)雜,并且包含一些繼承,您可以在上述演示文稿中找到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)常參考該文檔,以避免重復(fù)解釋兩次。

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為使用此平臺創(chuàng)建的每個應(yīng)用程序組件 引入了“命名空間”,以防止名稱在不同組件之間發(fā)生沖突。 這就是為什么每個實體名稱都有一個“ petclinic $”前綴的原因。
  • 建議對實體使用@NamePattern批注,以在UI中獲得有意義的實例表示形式。
  • 問題是–除了前綴和聲明性實體“字符串化”表示形式之外,CUBA還給我們帶來了什么? 其他功能包括:

  • 支持ID生成功能的基類:從整數(shù)ID到UUID。
  • 一組有用(但可選)的界面:
    • 版本化–支持實體版本。
    • SoftDelete –支持實體的“軟”刪除,也稱為“邏輯”刪除。
    • 可更新–添加用于實體更新日志記錄的字段。
    • 可創(chuàng)建的–添加用于實體創(chuàng)建日志記錄的字段。
      您可以在文檔中閱讀有關(guān)這些接口的更多信息。
  • CUBA Studio可以自動生成數(shù)據(jù)庫架構(gòu)創(chuàng)建和更新腳本。
  • 在應(yīng)用程序開發(fā)期間,我只是復(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 :

  • 行級和屬性級安全性支持。
  • CUBA的實體查看用于獲取數(shù)據(jù)的用法。
  • 動態(tài)屬性 。
  • 有關(guān)DataManager和EntityManager的更多信息,請參見
    文件 。 請注意,您不需要直接在GUI中使用這些bean –
    為此的數(shù)據(jù)源 。

    談?wù)揚etClinic –我(幾乎)沒有在Core模塊中編寫很多代碼,因為那里沒有復(fù)雜的業(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接口,如果您在某些復(fù)雜的情況下需要細粒度的事務(wù)管理。

    當我開發(fā)寵物診所時,我只考慮過一次交易-在開發(fā)允許編輯所有者,寵物和在同一屏幕上添加訪問的表格的過程中。 我需要了解何時提交事務(wù)并刷新UI以一致的方式顯示數(shù)據(jù)。

    不到一天的時間,我就可以使用“標準” CUBA UI創(chuàng)建具有與Spring寵物診所相同功能的應(yīng)用程序。 我不會說我是CUBA的專家(距我剛開始僅幾周時間),但是我使用Spring已有很長的歷史。 讓我們看一下考慮到Spring體系結(jié)構(gòu)的基于CUBA的應(yīng)用程序:
    域模型全局模塊中的實體。 創(chuàng)建實體模型是眾所周知的例程。 對于BaseIntegerIdEntity類,在ID生成上節(jié)省了一些時間表示贊賞。
    信息庫層 –我不需要信息庫。 甚至沒有接口。 我剛剛使用CUBA Studio GUI創(chuàng)建了一些視圖。 使用此工具,我不需要在配置中編寫XML。 服務(wù)層 –在我們的應(yīng)用程序中,我們只有兩個服務(wù)以JSON和XML格式導(dǎo)出獸醫(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)正確的UI流程,渲染器和應(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并學(xué)習(xí)它們的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是透明的。 源代碼可用,您可以調(diào)試所有內(nèi)容。
  • CUBA是靈活的(達到一定限制)。 您可以繼承并注入自己的bean,而不是標準CUBA bean,發(fā)布自定義REST API并使用您自己的UI框架與用戶進行交互。
  • CUBA是春天。 80%的后端代碼將是純Spring應(yīng)用程序。
  • 您可以快速開始。 創(chuàng)建第一個實體和UI屏幕后,即可準備使用應(yīng)用程序。
  • 您可以完成許多例行工作。
  • 因此,通過使用CUBA,您將節(jié)省一些日常任務(wù)的時間,從而真正享受與復(fù)雜的業(yè)務(wù)相關(guān)算法以及與其他應(yīng)用程序的輕松集成帶來的真正樂趣。

    翻譯自: https://www.javacodegeeks.com/2018/07/developing-cuba-big-shift-spring.html

    cuba開發(fā)

    總結(jié)

    以上是生活随笔為你收集整理的cuba开发_使用CUBA进行开发–与Spring相比有很大的转变?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。