spring一站式开发

在最近的(核心)Spring框架培训课程中,有人问我:“(Java)Spring开发人员应该知道的一件事是什么?” 这个问题使我措手不及。 是的,(核心)Spring框架确实涵盖了很多领域(例如,bean,配置,面向方面的编程,事务)。 我很难指出一件事。 最后,我提到了我们为期3天的培训课程所涵盖的所有内容。

如果(Java)Spring开发人员应该知道一件事,那应该是什么?

当我进一步思考这个问题时,我开始思考重要的一个问题。 我最后想到了Spring如何重要地使用方面将行为添加到托管对象(通常称为bean)中。 这就是Spring框架如何支持事务,安全性,范围,基于Java的配置等。 我在这篇文章中分享我的想法。

我最后想到了Spring如何重要地使用方面将行为添加到托管对象(通常称为bean)中。

ORM和延迟加载异常

大多数使用某种形式的ORM的开发人员都遇到了一个异常,该异常表明无法加载子实体(例如LazyInitializationException )。

一些遇到此问题的开发人员将使用“打开的视图中的会话”( OSIV )模式来保持会话打开并防止发生此异常。 但是我觉得这太过分了。 更糟糕的是,一些开发人员认为“开放会话可见”模式是唯一的解决方案。 造成这种误解的潜在根本原因可能是,开发人员可能不了解有效使用Spring Framework来保持ORM会话打开时间更长的知识。

对于JPA ,“打开视图中的实体管理器”模式将在请求开始时创建一个实体管理器,将其绑定到请求线程,并在响应完成时将其关闭。

那么,如果不是OSIV模式,哪种解决方案更好?

简短的答案是使用Spring框架在需要的时间内保持会话打开(例如@Transactional )。 请继续阅读,因为我会提供更长的答案。

服务和存储库

在分层体系结构中,典型的设计模式是定义域或应用程序服务 (通常定义为接口)以提供业务功能(例如,开始使用购物车,向该购物车添加商品,搜索产品)。 域和应用程序服务的实现通常会将域实体的检索/持久性委派给存储库。

存储库 (或数据访问对象)也被定义为检索/持久化域实体(即提供ORM和CRUD访问)的接口。 自然地,存储库实现使用ORM库(例如JPA / Hibernate,myBATIS)来检索和保留域实体。 这样,它使用ORM框架的类连接到持久性存储,检索/持久化实体并关闭连接(在Hibernate中称为会话)。 此时,没有延迟加载失败的问题。

当服务使用资料库中检索域实体,并希望加载的子实体(库方法返回之后 )发生的懒加载失败问题。 到存储库返回域实体时,ORM会话将关闭。 因此,尝试访问/加载域服务中的子实体会导致异常。

下面的代码段说明了当订单实体的子项目由存储库返回后被延迟加载时,如何发生延迟加载异常。

@Entity
public class Order {@OneToMany // defaults to FetchType.LAZYprivate List<OrderItem> items;…public List<OrderItem> getItems() {…}
}public class SomeApplicationServiceImpl implements SomeApplicationService {private OrderRepository orderRepository;…@Overridepublic void method1(…) {…order = orderRepository.findById(...);order.getItems(); // <-- Lazy loading exception occurs!…}…
}public class OrderRepositoryImpl implements OrderRepository {@PersistenceContextprivate EntityManager em;…@Overridepublic Order findById(...) {...}…
}

存储库实现将JPA明确用于其ORM(如使用EntityManager )。

在这一点上,一些开发人员可能选择使用紧急获取来防止延迟初始化异常。 告诉ORM急切地获取订单实体的子项将起作用。 但是有时候,我们不需要加载子项。 急切地加载它可能是不必要的开销。 仅在需要时加载它会很棒。

为了防止延迟初始化异常(而不是被迫急于获取),我们需要保持ORM会话打开,直到调用服务方法返回。 在Spring中,可以像@Transactional一样简单地注释服务方法以保持会话打开。 我发现这种方法比使用“在视图中打开会话”模式(或被迫使用紧急获取)更好,因为它仅在我们希望的持续时间内保持会话打开。

public class SomeApplicationServiceImpl implements SomeApplicationService {private OrderRepository orderRepository;…@Override@Transactional // <-- open the session (if it's not yet open)public void method1(…) {…order = orderRepository.findById(...);order.getItems(); // <-- Lazy loading exception should not happen…}…
}

表示层中的域实体

即使将ORM会话在服务层中(在存储库实现对象之外)保持打开状态,当我们将域实体暴露给表示层时,仍然可能发生惰性初始化异常。 同样,由于这个原因,一些开发人员更喜欢OSIV方法,因为它还可以防止表示层中的延迟初始化异常。

但是,为什么要在表示层中公开域实体?

根据经验,我曾与那些希望在表示层中公开域实体的团队合作。 这通常会导致贫血领域模型 ,因为表示层框架需要一种将输入值绑定到对象的方法。 这迫使域实体具有getter和setter方法以及零参数构造函数。 具有getter和setter将使不变式难以执行。 对于简单域,这是可行的。 但是对于更复杂的领域,更丰富的领域模型将是首选,因为它更易于实施不变式。

在更丰富的域模型中,表示表示层输入/输出值的对象实际上是数据传输对象(DTO)。 它们代表在域层中执行的输入(或命令)。 考虑到这一点,我更喜欢使用DTO并维护更丰富的域模型。 因此,我并没有真正在表示层遇到惰性初始化异常。

向受管对象添加行为的方面

Spring会拦截对这些@Transactional注释方法的调用,以确保ORM会话处于打开状态。

事务(或只是保持ORM会话保持打开状态)并不是使用方面提供的唯一行为。 有安全性,范围,基于Java的配置等。 知道Spring框架使用方面来添加行为是我们让Spring管理我们开发的POJO的主要原因之一。

结论

你去。 对我来说,这是Spring Framework开发人员在使用内核时应了解的最重要件事。 现在,我已经对什么是最重要的事情发表了意见,您呢? 在处理Core Spring时,您认为最重要件事是。 干杯!

翻译自: https://www.javacodegeeks.com/2016/02/one-thing-good-spring-developers-know.html

spring一站式开发

spring一站式开发_Spring开发人员知道的一件事相关推荐

  1. Spring开发人员知道的一件事

    在最近关于(核心)Spring Framework的培训课程中,有人问我:"(Java)Spring开发人员是否应该知道一件事,那应该是什么?" 这个问题使我措手不及. 是的,(核 ...

  2. EOS开发dApp前需要了解的五件事

    EOS只有6个月(2018年12月),但从Block'tivity和State of dApps上来看,它已经是世界上最常用的区块链之一.它是第一个碳中性区块链,它发展得比以往任何时候都快. 随着EO ...

  3. 我怎么看技术人员去创业公司这件事

    我怎么看技术人员去创业公司这件事. 当前,创业风潮席卷而来,很多人也会受到这个吸引和影响.分享一下我是怎么看这件事的.首先,我不会阻止你,因为大家有更好的机会,更多的薪水,我会为你高兴,你不去,我还得 ...

  4. 开发计费系统中学到的 5 件事

    不是所有货币都有小数位 在设计数据库表结构时,有一个普遍观点是"永远不要用浮点数来表示钱".一些人建议使用MONEY数据类型,另一些人则告诉你要使用DECIMAL. 对于计费系统来 ...

  5. 10年软件开发教会我最重要的10件事[转]

    1.面向对象比你想象的要难得多     也许只有我有这种想法,不过我曾经以为计算机科学课上学过的"面向对象"是很简单的东西.我的意思是,创建一些类来模拟现实世界能有多难啊?其实,那 ...

  6. spring 消息传递机制_Spring再次涵盖了您:继续进行消费者驱动的消息传递合同测试...

    spring 消息传递机制 在上一篇文章中,我们已经开始讨论基于消息的通信中的消费者驱动的合同测试 . 在今天的帖子中,我们将在测试工具箱中包含另一个工具,但是在此之前,让我对显微镜下的系统进行快速回 ...

  7. Spring简化Java开发_spring如何简化java开发

    1.spring简介 Spring的主要目的是用来替代更加重量级的企业级的java技术 2.spring如何简化java开发 1)基于POJO的轻量级和最小侵入性编程: 2)通过依赖注入和面向接口实现 ...

  8. 贝壳一站式大数据开发平台实践

    分享嘉宾:仰宗强 编辑整理:刘春龙 出品平台:DataFunTalk 导读:本次分享嘉宾是来自贝壳大数据部门的仰宗强,详细介绍了针对贝壳的业务数据与需求的增长,逐步升级数据开发平台的探索实践过程,包括 ...

  9. Spring 2企业应用开发

    Spring 2企业应用开发            诚邀加入图灵俱乐部:http://groups.csdn.net/Turingbooks(CSDN群组)               Spring作 ...

最新文章

  1. 2021年大数据常用语言Scala(二十八):scala面向对象 MAVEN依赖和类
  2. vue项目打包丢入服务器,浅谈vue项目如何打包扔向服务器
  3. win10计算机跑分,鲁大师如何跑分_鲁大师跑分详细教程
  4. .NET Core实战项目之CMS 第五章 入门篇-Dapper的快速入门看这篇就够了
  5. vnc用户名 查看linux_vnc用户名未被识别,5步教你如何解决vnc用户名未被识别
  6. rabbitmq topic 收不到数据_RabbitMQ和Kafka到底怎么选?
  7. Spring boot 配置array,list,map
  8. iview 按需引入解决加载慢的问题
  9. Codeforces Round #460 (Div. 2): D. Substring(有向图)
  10. python3 Tkinter GUI 试水
  11. 移动边缘计算环境下边缘服务器放置方法研究
  12. 从零开始学JAVA:一、Java语言概述
  13. 基本知识 100032
  14. 基于朴素贝叶斯的新闻分类
  15. 用AlexNet训练MSTAR数据集
  16. 游戏制作之路-unity捕鱼达人(一 开始以及加载界面的制作)
  17. 〖大前端 - 基础入门三大核心之CSS篇③〗- CSS选择器之复合选择器与伪类
  18. 无法安装office此计算机安装了32位,无法将 64 位 Office 与 32 位 Office 一起安装 | Microsoft Docs...
  19. P2550 彩票摇奖
  20. LabVIEW调用.so文件的方法

热门文章

  1. CF618F-Double Knapsack【结论】
  2. AT3950-[AGC022E]Median Replace【贪心,dp】
  3. 牛客练习赛69C-旅行【结论,最大生成树】
  4. ssl2340-格子游戏【并查集】
  5. hihocoder1147 时空阵(bfs树+DP)
  6. 多项式相关操作学习笔记
  7. SpringCloud Zuul(一)之介绍
  8. Scala与Java差异(四)之数组操作
  9. 再有人问你volatile是什么,把这篇文章也发给他(深入分析)
  10. 深入解读Service Mesh背后的技术细节