spring一站式开发_Spring开发人员知道的一件事

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 )。 请继续阅读,因为我会提供更长的答案。

服务和存储库

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

One_Thing_Good_Spring_Developers_Know

存储库 (或数据访问对象)也被定义为检索/持久化域实体(即提供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一站式开发

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/336756.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c语言十六进制转换加H,c语言十六进制和十进制间的转换.docx

集团文件版本号&#xff1a;(M928-T898-M248-WU2669-I2896-DQ586-M1988)集团文件版本号&#xff1a;(M928-T898-M248-WU2669-I2896-DQ586-M1988)c语言十六进制和十进制间的转换1.将十六进制转换为十进制.#include#includeint main(void){int convert(int,char *);int i,j;char …

jax-ws和jax-rs_带有JAX-WS和Spring的Web服务应用程序

jax-ws和jax-rs1.简介 这是一个漫长的等待&#xff0c;但是我最终要发布有关使用Spring创建第一个基于SOAP的Web服务应用程序的教程。 JAX-WS &#xff08;用于XML Web服务的Java API&#xff09;是用于以XML格式创建Web服务的一组API&#xff0c;我们最常将其称为基于SOAP的We…

c command语言学例子,语言学第四章

《语言学第四章》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《语言学第四章(3页珍藏版)》请在人人文库网上搜索。1、Chapter 4:SyntaxI. Decide whether each of the following statements is True or False:1. Syntax is a subfield of linguistics that studies …

eclipse开发jsf_在Eclipse上创建JSF / CDI Maven项目

eclipse开发jsf当我在研究JSF和CDI示例时&#xff0c;我认为提到创建JSF和CDI Maven项目所需的步骤会很有用。 您可以找到以下步骤。 工具类 默认情况下&#xff0c;M2E插件随附的Eclipse Luna。 因此&#xff0c;无需自己安装插件。 WildFlye8.x。 从主菜单中选择文件->…

apache camel_Apache Camel的性能调整思路

apache camel时不时地&#xff0c;我会以Camel速度较慢的观点来询问有关优化Camel应用程序的问题。 骆驼只是连接不同系统的粘合剂&#xff0c;路由引擎全部在内存中&#xff0c;并且不需要任何持久状态。 因此&#xff0c;在99&#xff05;的情况下&#xff0c;性能问题是由于…

为什么写C语言弹不出窗口,居然还有SB说C写不出窗口的..

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼decebx.endwassumeesi:nothinginvokeGetStockObject,WHITE_BRUSHinvokeSelectObject,hDcBack,eaxinvokeDeleteObject,eaxinvokeDeleteObject,hBmpBackpopadret_CreateBackGroundendp;>>>>>>>>>>>…

java写入单个字符_将2个字符写入单个Java char

java写入单个字符这是创建超低延迟的Chronicle FIX-Engine时使用的另一个好技巧。 在从字节流中读取数据时&#xff0c;如果可能的话&#xff0c;将数据存储在char而不是将其读取到String效率更高。 &#xff08;至少您要避免创建String对象&#xff0c;尽管可以通过使用缓存或…

xmanager linux,教您用xmanager启动Linux上的图形界面程序-Go语言中文社区

对于习惯实体化的开发人员来说&#xff0c;还是界面化用着比较习惯&#xff0c;所以这就涉及到掌握使用Xmanager启动Linux上的图形界面程序&#xff0c;为了方便大家的使用&#xff0c;本集小编就详细的为大家讲解具体操作。具体步骤如下&#xff1a;1、首先下载Xmanager并安装…

android开发 文件分享到应用,Android 实现文件分享功能(共享多个文件)

效果如图&#xff1a;神一样的代码&#xff1a;针对image代码如下&#xff1a;IntentsharenewIntent(Intent.ACTION_SEND);share.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(file));//此处一定要用Uri.fromFile(file),其中file为File类型&#xff0c;否则附件无法发送成功。s…

python kotlin_用Java和Python模仿Kotlin构建器

python kotlin介绍 Kotlin可能现在是我最喜欢的语言&#xff0c;可能它提供的最酷的功能之一是基于几个功能构建的类型安全的生成器&#xff08;稍后解释&#xff09;。 我发现自己真的很想在其他两种主要语言&#xff08;Java和Python&#xff09;中使用此功能。 本文解释了我…

android 4.4.2截屏方法,android4.4.2 使用 uiautoviewer 截屏报错

1、正常启动后&#xff0c;使用 uiautomatorviewer 没有问题2、由于要使用 uiautomator&#xff0c;每次启动 uiautomator 服务后再使用 uiautomatorviewer 就会图片错误&#xff0c;启动 uiautomator 服务的步骤如下&#xff1a;1、Download jar files from uiautomator jsonr…

java fastutil_具有FastUtil的精简Java集合

java fastutil针对我最近在GNU Trove库上发表的《 发现Java原始资源集合的处理 》一书 &#xff0c; TheAlchemist指出了fastutil优于trove的一些优点&#xff1a;“我更喜欢fastutil&#xff08; http://fastutil.di.unimi.it/ &#xff09;&#xff0c;因为它仍在积极开发中&…

android 圆角按钮渐变,Android实现圆形渐变加载进度条

最近设计要求要一个圆形进度条渐变的需求&#xff1a;1.画圆形进度条2.解决渐变最终实现效果代码package com.view;import android.content.Context;import android.content.res.TypedArray;import android.graphics.Canvas;import android.graphics.Color;import android.grap…

javaone_JavaOne 2015:为JDK 9做准备– blog @ CodeFX

javaoneJavaOne 2015看到了Project Jigsaw团队关于Java 9中的模块化的一系列讨论 。它们都是非常有趣的&#xff0c;并且充满了宝贵的信息&#xff0c;我敦促每个Java开发人员都注意它们。 除此之外&#xff0c;我想给社区一种搜索和引用它们的方法&#xff0c;因此我在这里总…

android wifi 通讯录,通过wifi和gmail从symbian手机中将名片夹(通讯录)导入到android手机 | 古意人...

使用背景与条件&#xff1a;最近入手了android手机defy&#xff0c;机器到手后兴奋过度&#xff0c;马上将原symbian手机诺基亚E50的sim卡和内存卡都转移到了defy上&#xff0c;捣鼓了一段时间的defy&#xff0c;突然想起要同步原诺基亚手机的名片夹到defy中(android中貌似称为…

oracle aq_通过Java 8流使用Oracle AQ

oracle aqOracle数据库最令人敬畏的功能之一是Oracle AQ&#xff1a;Oracle数据库高级队列 。 AQ API直接在数据库中实现了完整的事务性消息传递系统。 在数据库处于系统中心的经典体系结构中&#xff0c;使用AQ进行进程间通信时&#xff0c;多个应用程序&#xff08;其中一些…

c语言建立多个有名管道,命名管道一个非常经典的题目

#include /*特别注意写管道时&#xff0c;设置打开管道文件的格式必须为可写*/#define FIFO_SERVER "myfifo"#define OPENMODE (O_WRONLY | O_NONBLOCK)int main(int argc, char **argv){int fd;int nwrite;/*打开管道文件&#xff0c;可写非阻塞*/if ((fd open(FIF…

jit 方法内联_JIT编译器,内联和转义分析

jit 方法内联即时&#xff08;JIT&#xff09; 即时&#xff08;JIT&#xff09;编译器是Java虚拟机的大脑。 JVM中对JIT编译器的影响最大。 一会儿&#xff0c;让我们退后一步&#xff0c;看看已编译和未编译语言的示例。 诸如Go&#xff0c;C和C 之类的语言之所以称为编译语…

nodejs android 推送,利用Nodejs怎么实现一个微信小程序消息推送功能

利用Nodejs怎么实现一个微信小程序消息推送功能发布时间&#xff1a;2021-01-20 13:55:29来源&#xff1a;亿速云阅读&#xff1a;92作者&#xff1a;Leah今天就跟大家聊聊有关利用Nodejs怎么实现一个微信小程序消息推送功能&#xff0c;可能很多人都不太了解&#xff0c;为了让…

kafka spark_您在2016年会做什么? Apache Spark,Kafka,Drill等

kafka spark让我们玩得开心。 这是新的一年的开始-我们正处于新事物的门槛上-因此让我们期待您在2016年可能会做的事情。现在我知道做出预测的风险&#xff0c;尤其是有记录的预测&#xff0c;但是我很高兴您能在一年后回访&#xff0c;看看我对2016年的预测是如何完成的。 您…