Java Web 应用程序中的静态层

Posted

技术标签:

【中文标题】Java Web 应用程序中的静态层【英文标题】:Static layers in a java web application 【发布时间】:2010-09-12 11:28:48 【问题描述】:

我正在使用相当标准的 Web/服务/数据访问分层设计构建一个用于娱乐/学习的小型网站。

为了让我不必经常创建服务层/数据访问层类的实例,我将它们中的方法全部设为静态。我不应该遇到并发问题,因为它们使用局部变量等并且不共享任何资源(目前事情很简单)。

据我所知,唯一的权衡是我并没有真正遵循真正的 OO 方法,但它再次使代码更加简洁。

有什么理由这不是一种可行的方法吗?以后可能会出现什么样的问题?有一个“工厂”类可以根据需要返回服务和数据层类的实例会更好吗?

【问题讨论】:

【参考方案1】:

您知道游乐园里的那些游乐设施,他们说“请始终将手和脚放在游乐设施内”吗?事实证明,如果你不这样做,骑行会更有趣。唯一真正的权衡是,您并没有真正遵循真正的“手脚并用”的方法。

重点是——你应该遵循“真正的 OO 方法”是有原因的,就像你有理由将手和脚保持在骑行中一样——这很有趣,直到你开始到处流血。

【讨论】:

【参考方案2】:

按照您的描述方式,这本身并不是“错误”的方法,但我并没有真正看到您要避免的问题。您不能在服务器启动时创建这些业务对象的单个实例并根据需要将它们传递给您的 servlet 吗?

如果您准备好将 OO 抛到窗外,您可能还想查看 Singleton 模式。

【讨论】:

【参考方案3】:

缺点:

您将无法编写单元测试,因为您将无法编写模拟数据访问/业务逻辑对象进行测试。 您将遇到并发问题,因为不同的线程尝试同时访问静态代码 - 或者如果您使用同步的静态方法,您最终会遇到线程排队使用静态方法。 您将无法使用实例变量,随着代码变得越来越复杂,这将成为一种限制。 如果需要,替换业务或数据访问层的元素会更加困难。 如果您打算以这种方式编写您的应用程序,最好使用一种旨在以这种方式工作的语言,例如 php

您最好选择非静态业务/数据访问层类:

使用单例模式(创建每个类的单个实例并在线程之间共享它们)... 或者在需要时在每个线程中创建类的实例。

请记住,连接到您的应用程序的每个用户/会话都将在其自己的线程中运行 - 因此您的 Web 应用程序本质上是多线程的。

【讨论】:

【参考方案4】:

我真的看不出你的设计有什么优势,而且有很多地方可能会出错。您正在节省一行代码,也许?以下是您的方法的一些缺点:

您无法轻松替换业务逻辑的实现 您不能定义实例变量以方便将逻辑分解为多个方法 您认为不会出现多线程问题的假设几乎肯定是错误的 你不能轻易地模拟它们进行测试

我真的不认为遗漏一行代码会给你带来任何好处。

这并不是真正的“OO 设计”问题,而更多的是适当性。你为什么还要以这种程序化的方式使用 Java?当然 PHP 会更适合这种设计(实际上通过不必编译和部署来节省您的时间)。

我只想让您的业务层非静态;它将使您的应用程序的维护、更改和发展变得更加容易。

【讨论】:

【参考方案5】:

您可能难以使用这种类型的架构对您的对象进行单元测试。例如,如果您有一个引用静态数据访问层的业务对象层,则可能难以测试业务层,因为您将无法轻松使用模拟数据访问对象。也就是说,在测试业务层时,您可能不想使用数据访问层中的“真实”方法,因为它们会对您的数据库进行不必要的更改。如果您的数据访问层不是静态的,您可以为业务层提供模拟数据访问对象以进行测试。

【讨论】:

【参考方案6】:

我认为您会遇到所有具有多个用户的静态方法的并发问题。 Web 层将线程化并发用户。你所有的静态方法都可以处理这个吗?也许吧,但他们不会一直被锁定在单个文件中的请求队列中吗?我不确定,从未尝试过你的想法。

【讨论】:

以上是关于Java Web 应用程序中的静态层的主要内容,如果未能解决你的问题,请参考以下文章

web应用中的动态资源和静态资源分别指啥?

说说Java Web中的Web应用程序|乐字节

Java Web中的mapper,service,controller,model究竟分别是啥作用?

预习网络服务器 http协议,静态资源,web服务器

网页静态化(freemarker)

Java基础-书籍Web服务器与应用服务器-review