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的GlobalCore模块及其内容。

全局模块

实体模型

使用JPA兼容ORM框架和Spring的任何开发人员都应该熟悉CUBA应用程序中的实体模型。 它只是用@ Table,@ Entity等注释的类,并在persistence.xml文件中注册。

在Pet Clinic应用程序的实体模型中,您可以重用Spring版本中的代码,但是您需要记住以下几点:

  1. CUBA为使用此平台创建的每个应用程序组件 引入了“命名空间”,以防止名称在不同组件之间发生冲突。 这就是为什么每个实体名称都有一个“ petclinic $”前缀的原因。
  2. 建议对实体使用@NamePattern批注,以在UI中获得有意义的实例表示形式。

问题是–除了前缀和声明性实体“字符串化”表示形式之外,CUBA还给我们带来了什么? 其他功能包括:

  1. 支持ID生成功能的基类:从整数ID到UUID。
  2. 一组有用(但可选)的界面:
    • 版本化–支持实体版本。
    • SoftDelete –支持实体的“软”删除,也称为“逻辑”删除。
    • 可更新–添加用于实体更新日志记录的字段。
    • 可创建的–添加用于实体创建日志记录的字段。
      您可以在文档中阅读有关这些接口的更多信息。
  3. CUBA Studio可以自动生成数据库架构创建和更新脚本。

在应用程序开发期间,我只是复制了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 :

  1. 行级和属性级安全性支持。
  2. CUBA的实体查看用于获取数据的用法。
  3. 动态属性 。

有关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平台作为基础,因为:

  1. CUBA是透明的。 源代码可用,您可以调试所有内容。
  2. CUBA是灵活的(达到一定限制)。 您可以继承并注入自己的bean,而不是标准CUBA bean,发布自定义REST API并使用您自己的UI框架与用户进行交互。
  3. CUBA是春天。 80%的后端代码将是纯Spring应用程序。
  4. 您可以快速开始。 创建第一个实体和UI屏幕后,即可准备使用应用程序。
  5. 您可以完成许多例行工作。

因此,通过使用CUBA,您将节省一些日常任务的时间,从而真正享受与复杂的业务相关算法以及与其他应用程序的轻松集成带来的真正乐趣。

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

cuba开发

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

  1. Linux下驱动开发_块设备驱动开发(硬件上采用SD卡+SPI协议)

    一.前言 块设备主要为存储设备设计的框架. 在前面章节Linux下驱动开发_块设备驱动开发(内存模拟存储) 里介绍了块设备驱动编写思路,并且利用内存模拟了硬件存储,完成了块设备驱动开发测试.这一篇文章 ...

  2. js室内地图开发_如何组件化开发WebGIS系统

    本文同发于本人博客:http://giscafer.com/2017/01/10/modularization-webgis/ 先啰嗦两句 前面聊过<探讨如何使用流行的前端技术开发WebGIS系 ...

  3. android应用程序开发_抚顺小程序开发定制找谁,吉林小程序定制

    湖南庚午网络科技有限公司为您详细解读kpuZae抚顺小程序开发定制找谁的相关知识与详情,微信小法式,简称小法式,缩写XCX,英文名Mini Program,是一种不需要#安拆即可使用的应用,它实现了应 ...

  4. 如果成为一名高级安卓开发_什么是高级开发人员,我如何成为一名开发人员?

    如果成为一名高级安卓开发 Becoming a Senior Developer is something many of us strive for as we continue our code ...

  5. 敏捷开发_全面解析瀑布式开发和敏捷式开发

    ​​很多人毕业后,都在从事跟所学专业不同的工作,有的人一筹莫展,有的人习以为常. 我是一名编导生,毕业后去做抗战纪录片,工作中接触更多的是历史.影像与表达.但一个偶然的契机,让我转战 向 互联网产品行 ...

  6. gwt前台开发_为GWT设置开发环境

    gwt前台开发 介绍 这是旨在用Java开发跨平台移动应用程序的系列文章的一部分 . 在此博客文章中,我们将了解GWT是什么,并为GWT设置开发环境. GWT是一个开源开发工具包,用于开发基于浏览器的 ...

  7. 简单Android app开发_如何简单快速开发外卖app?

    如何开发一个外卖app?app开发需要多少钱?随着美团.饿了么的外卖app的发展,对餐饮.生鲜果蔬.超市便利店行业来说,app成为必不可缺少的一部分.与其向第三方交纳一定不开发一个自己的外卖平台.也有 ...

  8. 移动应用程序开发_移动应用程序开发生命周期-从开发到应用程序商店的应用程序之旅

    移动应用程序开发 Lately, app stores have witnessed a meteoric rise in the number of apps available to them. ...

  9. unity 3d游戏开发_使用Unity 5开发3D游戏

    unity 3d游戏开发 If there's one thing cooler than playing games, it's building games. 如果有比玩游戏更酷的一件事,那就是构 ...

最新文章

  1. PHPStorm使用指南
  2. Eclipse中在线安装spring-tool-suite插件
  3. STM32F4 HAL库开发 -- GPIO
  4. POJ - 3922 A simple stone game(K倍博弈-斐波那契博弈进阶)
  5. 认识计算机ppt课件游戏,《认识计算机》PPT课件
  6. 设计模式---4(抽象工厂模式的概念,产品组和产品等级的概念,抽象工厂模式的实现)
  7. java中string的方法_java中String的常用方法
  8. 胃癌2019csco指南_2019 CSCO胃癌诊疗指南精华来了!
  9. 小米集团2021未来星专项招聘计划!
  10. (32)VHDL实现同步复位D触发器
  11. LeetCode #1349. 参加考试的最大学生数 - 学到了:压缩状态动态规划、位运算、reduce()、str().count()
  12. %02 java_Java基础02—变量、运算符和数据类型转换(示例代码)
  13. VTM3.0代码阅读:xCheckRDCostMerge2Nx2N函数
  14. IPQ4019MTD分区生成的过程
  15. Nordic--nrf52832--FDS(一)基本介绍
  16. c语言中实现阶乘的方法,c语言实现阶乘的方法
  17. 47页数字孪生人脸识别轨迹分析电子围栏智慧工地解决方案
  18. css3 clac函数的易错整理
  19. js 小写金额转大写
  20. 部落卫队问题 (回溯)

热门文章

  1. [APIO2013]机器人(DP+SPFA最短路)
  2. P2101-命运石之门的选择【dp,离散化】
  3. P3629-[APIO2010]巡逻【树的直径】
  4. 彻底理解JVM常考题之分级引用模型
  5. 为什么大公司一定要使用DevOps
  6. 使用cardme读写VCard文件,实现批量导入导出电话簿
  7. 为什么byte取值-128~127??
  8. Spring Boot Debug调试
  9. 【Android】实现页面跳转
  10. freemarker中遇到null报错的处理方法