春天是一个美化的工厂;这可以接受吗?

时间:2009-02-27 16:43:33

标签: java spring

我刚刚继承了Java应用程序,并且在检查代码时,我看到了IMHO是Spring框架的混蛋。你看,Java团队似乎对接口有厌恶,所以我们最终得到这样的东西:

@Autowired
private SomeConcreteFinalClass _myField;

没有Spring配置,没有定义bean,也没有机会我可以单独测试包含对象。这本质上是一个基于注释的工厂,具有Spring的开销。

我不在线,或者这就像使用大象枪杀死苍蝇一样?我只需要进行现实检查,因为团队中的其他人认为这是完全可以接受的。

修改的 在许多情况下,这些带注释的工厂出现在复杂的处理类中,这些类将从隔离测试中获益匪浅。尽管如此,该团队也对此进行了测试。

我希望这里没有神秘感。如果我有一个具体的类,那不是一个接口,并且没有相应的Spring bean来“设置”该对象,那么它无疑是一个可以用10行代码实现的美化工厂。

系统中没有以任何其他方式使用Spring;就是这样。

我现在的目标:

  • 制定测试政策
  • 教育 关于组件优点的团队 隔离
  • 移动这些自动连接字段 在接口后面

我想最后一个问题是:如果我们没有测试或以任何其他方式利用框架,保持这些字段是否有任何好处。如果依赖项是不可变的,我也会new对象。

4 个答案:

答案 0 :(得分:4)

我同意你的意见,这是对Spring可以做的事情的滥用(与Spring应该做的相反)。以这种方式设计应用程序的人是谁?听到他们以这种方式构建应用程序的理由会很有趣。

答案 1 :(得分:4)

这肯定限制了可能性,但这也不是浪费时间。

由于有问题的类型是final,因此无法轻易进行模拟以进行隔离测试。

但是,该类型的实例仍可通过其属性进行高度配置。使用Spring注入在运行时正确配置的实例可以极大地简化包含类。该课程可以专注于其职责,依靠Spring为其提供所需的协作者。

接口 过度使用;这可能是对此的回应。我认为从许多类型的最终具体类开始,然后使用随时可用的重构工具在以后提取接口时,在确定特定需求时,在许多情况下都是一个可防御的位置。

答案 2 :(得分:1)

我不能说我完全明白这一点。毕竟,用main方法连接系统可能需要几行代码,然后你就不会依赖Spring了。

是的,我同意不注入接口有点毫无意义。我倾向于不进行大量的单元测试,但即便如此,我将在以后更改实现时失去任何灵活性(或者在不同的部署中具有不同的类实现 - 例如集成测试)。

答案 3 :(得分:1)

对不起,但我不知道这是不是基于您发布的两行代码滥用Spring,我怀疑其他人也可以。

如果您抱怨该对象的静态类型不是接口这一事实,您可能会有一个观点。但即使这很难从单行代码中分辨出来。这真的是没有接口的服务或存储库类吗?如果是的话,我同意。如果没有,我需要了解更多。

如果你的团队对测试不满意,那太糟糕了。我原以为Spring的原因之一就是为了方便测试。

你可能有一点意见,但我不能确定你原来的问题。也许你可以更详细地编辑。

如果这是你与队友沟通的一个例子,如果他们说你没有很好地解释自己,也许他们是合理的。确保你不仅仅是出于自我扩张的目的。