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