我刚刚继承了Java应用程序,并且在检查代码时,我看到了IMHO是Spring框架的混蛋。你看,Java团队似乎对接口有厌恶,所以我们最终得到这样的东西:
@Autowired
private SomeConcreteFinalClass _myField;
没有Spring配置,没有定义bean,也没有机会我可以单独测试包含对象。这本质上是一个基于注释的工厂,具有Spring的开销。
我不在线,或者这就像使用大象枪杀死苍蝇一样?我只需要进行现实检查,因为团队中的其他人认为这是完全可以接受的。
修改的 在许多情况下,这些带注释的工厂出现在复杂的处理类中,这些类将从隔离测试中获益匪浅。尽管如此,该团队也对此进行了测试。
我希望这里没有神秘感。如果我有一个具体的类,那不是一个接口,并且没有相应的Spring bean来“设置”该对象,那么它无疑是一个可以用10行代码实现的美化工厂。
系统中没有以任何其他方式使用Spring;就是这样。
我现在的目标:
我想最后一个问题是:如果我们没有测试或以任何其他方式利用框架,保持这些字段是否有任何好处。如果依赖项是不可变的,我也会new
对象。
答案 0 :(得分:4)
我同意你的意见,这是对Spring可以做的事情的滥用(与Spring应该做的相反)。以这种方式设计应用程序的人是谁?听到他们以这种方式构建应用程序的理由会很有趣。
答案 1 :(得分:4)
这肯定限制了可能性,但这也不是浪费时间。
由于有问题的类型是final
,因此无法轻易进行模拟以进行隔离测试。
但是,该类型的实例仍可通过其属性进行高度配置。使用Spring注入在运行时正确配置的实例可以极大地简化包含类。该课程可以专注于其职责,依靠Spring为其提供所需的协作者。
接口 过度使用;这可能是对此的回应。我认为从许多类型的最终具体类开始,然后使用随时可用的重构工具在以后提取接口时,在确定特定需求时,在许多情况下都是一个可防御的位置。
答案 2 :(得分:1)
我不能说我完全明白这一点。毕竟,用main
方法连接系统可能需要几行代码,然后你就不会依赖Spring了。
是的,我同意不注入接口有点毫无意义。我倾向于不进行大量的单元测试,但即便如此,我将在以后更改实现时失去任何灵活性(或者在不同的部署中具有不同的类实现 - 例如集成测试)。
答案 3 :(得分:1)
对不起,但我不知道这是不是基于您发布的两行代码滥用Spring,我怀疑其他人也可以。
如果您抱怨该对象的静态类型不是接口这一事实,您可能会有一个观点。但即使这很难从单行代码中分辨出来。这真的是没有接口的服务或存储库类吗?如果是的话,我同意。如果没有,我需要了解更多。
如果你的团队对测试不满意,那太糟糕了。我原以为Spring的原因之一就是为了方便测试。
你可能有一点意见,但我不能确定你原来的问题。也许你可以更详细地编辑。
如果这是你与队友沟通的一个例子,如果他们说你没有很好地解释自己,也许他们是合理的。确保你不仅仅是出于自我扩张的目的。