阅读另一个供内部公司使用的Web项目的要求时,您(至少是我自己)通常会看到一个很普通的集合:定义明确的数据存储结构(或有时是现有的旧式DB),大量的数据输入形式,非常复杂的业务逻辑,报告和与许多现有公司系统的集成,从会计到供应管理,成千上万的并发用户。 你首先想到的是什么?

“好的,我将使用著名的RDBMS,Hibernate / JPA + Spring Boot,添加REST API并使用我最喜欢的/最新的JS框架来实现UI。”

“啊。 而且我需要设置Spring Security。 也许添加一些自定义代码以保护行级别的数据。 我将如何实施? 可能是数据库视图或虚拟专用数据库。”

“以及所有这些DAO –它们相似且无聊,但我需要实现它们。”

“并使用ModelMapper之类的工具将JPA实体转换为REST的DTO。”

“而且别忘了告诉约翰-我们的新实习生-懒惰获取和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 Pet Pet Clinic相同功能的应用程序。 我不会说我是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进行开发–是Spring的重大转变吗?相关推荐

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

    cuba开发 阅读另一个供内部公司使用的Web项目的要求时,您(至少是我自己)通常会看到一个很普通的集合:定义明确的数据存储结构(或有时是现有的旧数据库),大量的数据输入形式,非常复杂的业务逻辑,报告 ...

  2. 可视化Spring开发插件 Spring IDE

    Spring IDE是一系列Eclipse插件,目的开发基于Spring的应用,最新发布的Spring IDE增加了对Spring Webflow支持.Spring Webflow是下一代Java W ...

  3. 【Spring开发】—— Spring Core

    原文:[Spring开发]-- Spring Core 前言 最近由于一些工作的需要,还有自己知识的匮乏再次翻开spring.正好整理了一下相关的知识,弥补了之前对spring的一些错误认知.这一次学 ...

  4. spring注解开发配置spring父子容器

    spring注解开发配置spring父子容器 官网 https://docs.spring.io/spring-framework/docs/current/spring-framework-refe ...

  5. 从零搭建开发脚手架 Spring Boot集成Mybatis-plus之一

    文章目录 简介 特性 框架结构 依赖集成 依赖 配置 编码 开始使用 核心功能 代码生成器 添加依赖 编码 编写配置 自定义模板引擎 自定义代码模板 自定义属性注入 字段其他信息查询注入 实战总结 常 ...

  6. spring注解驱动开发-5 Spring AOP实现

    Spring AOP实现 前言 AOP案例实现 1.编写目标类 2.编写切面类 3.编写配置类 4.编写测试类 end... 前言 AOP为Aspect Oriented Programming的缩写 ...

  7. spring注解驱动开发-8 Spring 扩展原理

    Spring 扩展原理 前言 BeanFactoryPostProcessor 测试实例编写 ExtConfig MyBeanFactoryPostProcessor ExtTest 源码分析 Bea ...

  8. spring注解驱动开发-4 Spring 自动装配

    Spring 自动装配 前言 Spring 自动装配的几种方式 1.@Autowired @Qualifier("组件id") @Primary 2.@Resource方式 3.@ ...

  9. spring注解驱动开发-7 Spring声明式事务

    Spring 声明式事务 前言 @EnableTransactionManagement AutoProxyRegistrar InfrastructureAdvisorAutoProxyCreato ...

最新文章

  1. 2020 腾讯广告算法大赛:突破高分瓶颈方案分享
  2. ASA用ASDM管理时报unable to launch device manager xxx.xxx.xxx.xxx
  3. 每天一道LeetCode-----找到序列中第一个没有出现的正整数,要求时间复杂度是O(n),空间复杂度是O(1)
  4. Sublime Text3 配置设置攻略
  5. 7-1 抓老鼠啊~亏了还是赚了? (20 分)
  6. 淘宝网秒杀需求分析与实现 - 公开课笔记
  7. 多级神经网络结构表达文档语义性能更好吗
  8. [vue] 动态给vue的data添加一个新的属性时会发生什么?怎样解决?
  9. html 行级元素和块级元素标签列表分别有哪些
  10. Javascript高级程序设计读书笔记(第三章)
  11. 61家第三方收单机构、247家商业银行、70家农商银行及119家村镇银行收单机构号
  12. 数字转成人民币汉字大写(李刚著《疯狂Python讲义》P87,解决小数部分及多个零的问题。学习笔记)
  13. Oracleji数据库、实例、用户、表空间、表之间的关系
  14. eNSP:如何解决防火墙上出现大量的提示信息呢?
  15. 微信的用户已退出是什么意思_秋天的第一杯奶茶是什么梗 微信朋友圈52元奶茶红包是什么意思...
  16. 有创意的思维导图怎么画
  17. java集合面试锦集
  18. 深度:中老年化妆品市场规模超千亿,7000条中老年化妆品消费数据里藏着哪些商业机会?
  19. 转换word等文件为swf文件
  20. 以太坊Dapp通过web3js部署调用智能合约

热门文章

  1. 【二分】【SPFA】架设电话线(jzoj 2132)
  2. [BZOJ1095][ZJOI2007]捉迷藏 Query on a tree IV(树链剖分)
  3. 2017西安交大ACM小学期数据结构 [分块、二维矩阵]
  4. Oracle入门(十四.3)之创建PL / SQL块
  5. 阿里巴巴对Java编程【OOP规约】的规约
  6. 指定查找区间,查找学生姓名并显示是否修改成功
  7. 单例模式懒汉式(线程安全写法)
  8. 2018蓝桥杯省赛---java---C---1(哪天返回)
  9. zookeeper出现Error contacting service. It is probably not running.
  10. 微型计算机中被处理信息称为,2011海南省计算机等级考试试题 二级C试题考资料...