多年来,我一直在编写软件,并且一直试图创建富有表现力、清晰可读、可维护、健壮的代码。最近,我加入了一个使用 Spring 托管对象开发 Web 应用程序的团队。但我对这项技术感到非常不舒服。对我来说,感觉就像所有封装和信息隐藏原则,几十年软件工程的成果,都被抛弃了。我清楚地看到使用控制反转容器的优点,将系统依赖项从程序代码移到配置文件中。但是现在,我看到 Spring 的使用方式,我觉得,只是增加了一堆不必要的复杂性,而没有产生任何好处。
使用 Spring 创建 webapp 支持 bean,对象不再清晰地组织在模块中,并且不再具有最小的可见性。相反,现在有一个单一的、全局的 bean 名称空间。正因为如此,对象往往会得到像“pendingOrderCustomerName”这样糟糕的名称,更糟糕的是,这些名称甚至无法清楚地标识一个定义良好的实体,因为 bean 定义可以来自各种定义源,从公开指定的位置收集: Spring beans 不是简单地定义为包中的类,而是从 xml 文件组装而成,具有自由覆盖的可能性和松散定义的关系。
例如,当我在普通 java 中拥有一个类型“Account”时,在包“my.webstore”中,我通常可以在一个地方了解该类型的属性、关系和能力,即“my/webstore/Account. java”文件。“帐户”的实例作为与帐户一起使用的对象中的引用存在,任何实例的状态都由该类精确定义。然而,使用 Spring bean,事情变得更加复杂:“Account”实例现在存在于全局名称下,在容器管理的范围内,具有从 xml 文件组装的状态,沿着基于命名模式的文件搜索路径找到...
过去,要了解对象的作用和行为方式,您只需阅读其程序源代码即可。今天,您需要对象的 java 源代码(可能很复杂,难以理解),而且您必须找到任何可能改变该对象的配置文件,这并不容易,因为您必须找出配置可能来自的所有方式你必须找出它们相互覆盖的顺序
也许这只是口味问题,但我也想知道为什么人们更喜欢冗长、笨拙的 xml 语法,例如:
<bean id="p1" class="Point" scope="prototype">
<property name="x">
<value>20</value>
</property>
<property name="y">
<value>80</value>
</property>
</bean>
对此:
p1 = new Point(20,80);
这个例子可能看起来很夸张,但我告诉你我见过更糟的!
我无意批评 Spring 框架本身,它在许多情况下非常强大并且是一个极好的成分。我关心的是如何防止误用,如何保持可维护性,如何保证质量和稳定性,如何找到依赖关系,如何记录代码......你的经验是什么?