当前位置: 首页 > 面试题库 >

Web体系结构:MVC,延迟初始化,数据传输对象,Open Session In View,是否存在共识方法?

姬昊焱
2023-03-14
问题内容

对于典型的Web 3层应用程序,您在以下设计中看到哪些缺陷(以及您的理想体系结构建议)?

我当前的蓝图方法大致就是这样(假设Java,Spring,Hibernate,JSP)

无状态的,可能包裹着只读事务(以避免延迟的init异常)的状态,仅通过服务从持久性存储中获取get的实体,然后将它们作为模型传递给视图。在它们上执行业务逻辑(BL应该仅在服务层中吗?),并在需要时传递回服务层以进行持久化。

优点 :对于只读事务包装-
仅一个连接,同一持久实体没有冗余命中,更好地利用了查询缓存,服务层不应“知道”请求参数或所需的初始化图范围,避免出现惰性初始化异常。

缺点 :只读事务处理方法可能有风险,控制器不是理想的Business Logic挂架…很难做到JUnits(您的输入是请求…)

视图

非事务性(访问非惰性集合/成员将导致惰性初始化异常)

优点

  • 视图作者不应仅通过点符号来影响应用程序的性能(例如,由于懒惰初始化大型集合而导致N + 1选择)。

  • 另外,在断开连接的客户端(Flex或其他Rich Client)中,不支持远程懒惰初始化,或者这不是明智的选择

缺点 :控制器/服务/
DAO必须为视图仔细准备正确的实体图,并且可能是过冲(性能)/欠冲(惰性初始化异常)。大量的服务器端方法可能导致混乱,因为存在可以对实体图进行初始化的排列数量的笛卡尔乘积

模型

按原样使用持久对象(不使用数据传输对象),将状态保存在会话中。

优点 :无需重写POJO,重用现有实体,会话状态比隐藏字段状态处理更安全。

缺点 :不利于断开的框架,保存陈旧的断开的对象的风险,存在锁定问题的风险,覆盖其他人的数据,有时需要乐观锁定。

服务

事务性的,不知道请求范围,调用DAO层进行实际的持久性存储访问。这是BL的经典配置,但是BL似乎一遍又一遍地泄漏到控制器端。

包含原子持久性存储外观,BL的无知或任何上下文

最后,问题是:

您将在上述架构中解决什么问题?

您是否认为(像我一样)这是一种非常普遍的方法(有一些细微的差异,例如公开会话等)?还是您第一次看到它,而我做某件事却完全错误(或正确)?

您如何在应用程序中解决它?您是否也将实体POJO用于​​模型和视图?还是将其连接到更简单的UI Bean(均已完全初始化且安全)?

这可能是一个主观的问题,但是我敢肯定,存在明显的最佳实践设计模式,它们可以聚集到一个,两个或三个最大的一般“宗教”上。


问题答案:

总的来说,它看起来是一个非常好的架构。如果您还没有阅读它,我将推荐企业应用程序体系结构的Martin Fowlers模式,该模式描述了问题中的每个主题。

从这个问题尚不清楚,您期望性能有多大。以我的经验,性能瓶颈很少出现在您认为的位置,而且您越早发现它们,就越容易更改架构以使其匹配。

您认为可测试性是一个主要问题是正确的。我已经成功使用了Martin Fowlers
被动视图-模式。您还应该在同一站点上查看Supervising
Controller。



 类似资料:
  • 我正在开发一个Spring-MVC应用程序,其中我有3个类,组扫描,组节,组注释。组扫描器具有与组节的一对多映射,组节与组注释具有一对多映射。我正在尝试根据 GroupCanvas 的主键检索注释,但我收到Hibernate延迟初始化异常。我在网上尝试了这些建议,主要是SO,但似乎没有帮助。这是代码。 DAO 方法抛出错误: GroupCanvas模型: 组段模型类: 群注释: 错误日志: 我做错

  • 7.4.4 延迟初始化的bean 默认情况下,ApplicationContext实现在初始化过程中随即创建和配置所有单例bean。一般来说,这种预实例化是可取的,因为可以立即发现配置或周围环境中的错误,而不是在几个小时甚至几天以后。当这种行为不可取时,可以通过将bean定义标记为延迟初始化来阻止预实例化。延迟初始化的bean告诉IoC容器,当bean首次被请求时而不是在启动时创建一个实例。 在X

  • 问题内容: 这是一个非常广泛的枚举单例代码: 一堆地方说这是一个懒惰的初始化。但我很困惑我“读的第7章后,里面的Java虚拟机 ” -一个类型的生命周期: Java虚拟机规范在类和接口加载和链接的时间上为实现提供了灵活性,但严格定义了初始化的时间。所有实现都必须在首次使用时初始化每个类或接口。以下六种情况可作为有效使用: 将创建一个类的新实例(以字节码表示,一条新指令的执行。或者,通过隐式创建,反

  • 主要内容:初始化内嵌匿名结构体结构体内嵌初始化时,将结构体内嵌的类型作为字段名像普通结构体一样进行初始化,详细实现过程请参考下面的代码。 车辆结构的组装和初始化: 代码说明如下: 第 6 行定义车轮结构。 第 11 行定义引擎结构。 第 17 行定义车结构,由车轮和引擎结构体嵌入。 第 27 行,将 Car 的 Wheel 字段使用 Wheel 结构体进行初始化。 第 32 行,将 Car 的 Engine 字段使用 Engi

  • 问题内容: 有两个JPA实体:具有一对多关系的用户和订单。 我在每个方法都在事务中运行的服务层类中使用这些实体。一切都很好,除非服务层类的方法必须返回这些实体。 此方法可以很好地返回数据。但是,当我尝试访问接收到的集合元素时,我捕获到异常:“ org.hibernate.LazyInitializationException:无法延迟初始化角色集合:package.User.orders,没有会话

  • 问题内容: 嗨,我是新手,想尽办法。如何从json对象初始化结构。我不知道该怎么办。 {“用户”:{“名称”:“ cruskuaka”,“电子邮件”:“ cristlika@gmail.com”,“电话号码”:“ 018833455”},“地址”:{“房屋”:“ 100”,“街道“:” B“,”镇“:{” town_id“:” 1“,” town_name“:”高威市中心“},” city“:{”