我一直试图找到这个问题的明确答案一段时间,但没有任何运气。我需要知道为什么Struts紧密耦合? struts的哪个组件使它紧密耦合。
答案 0 :(得分:0)
正如这篇伟大的Mkyong article所讨论的那样,Struts紧密耦合的原因并不是某些东西的存在,而是缺席。 Struts基本上是一个Web UI框架,可以与Spring MVC进行比较。但是,与Spring不同,Struts对依赖注入没有开箱即用的支持。因此,这意味着在使用Struts时,如果给定的权限发生变化,则可能必须更改整个代码。另一种说法是,你在Struts中使用的组件与框架紧密耦合。
答案 1 :(得分:0)
有两种方法可以看待这个问题:
问题#1
消除这一点是微不足道的;使用受支持的Spring版本,并且您在应用程序级别拥有所需的所有DI,例如,您可以注入您的服务,使用AOP连接等等。
在框架级别,您没有相同的灵活性。你不能随意替换Struts 1框架组件。这就是为什么自定义请求处理器和操作基类是需要框架级功能的第一种方法 - 没有别的地方可以使用它。
第2期
消除问题#2不是那么简单:Struts工件都引用了servlet spec工件,比如HTTP请求和响应。如果您想抽象出来,例如,为了便于测试或业务逻辑重用,您必须手动完成。
一个例子是将请求参数(例如,表单值)编组到域对象或简单映射中,并将其传递给域逻辑。
Struts 1是在DI / IoC是酷孩子们正在做的事情之前写的,在严格的层隔离是常见的之前等等。它是早期写的。。多年来它一直带着这个包袱,因为向后兼容是一件事。
你可能会认为与servlet规范的耦合是好还是坏:它实际上是业务逻辑和Web应用程序之间的隔离在哪里发生,谁负责它,以及你想如何测试它。
单元测试Struts 1动作是一种PITA。如果它所做的只是处理web-app-to-business-logic编组它是可靠的,他们不需要需要进行单元测试:业务逻辑确实如此,但Struts 1层可以通过Web应用程序级别的集成测试。 (我认为即使是有意义的,我对Struts 2动作测试也有同样的看法 - 但是S2动作很容易测试(除了重型拦截器交互和其他一些不太常见的事情),差异化程度较低重要的。