JavaSpring真的比直接的Java编程好吗

JavaSpring真的比直接的Java编程好吗,spring,Spring,我已经读到依赖注入对测试很好,因为一个类可以在没有依赖的情况下进行测试,但是我想到的问题是,如果类a依赖于类B或C或任何类,那么独立于某个类测试类a会产生零的测试结果,而不是失败或过去的测试 创建类A是为了做一些事情,如果它没有得到任何反馈,无论是使用新的关键字还是在Spring中设置额外的文件,那么类A将不会做任何工作 关于代码模块化、可读性和可维护性的想法:因此业务类变得更干净,但我们所做的只是将混乱从肮脏的Java业务类转移到复杂的XML文件,并删除用于注入松散对象的接口 简言之,似乎我们

我已经读到依赖注入对测试很好,因为一个类可以在没有依赖的情况下进行测试,但是我想到的问题是,如果类a依赖于类B或C或任何类,那么独立于某个类测试类a会产生零的测试结果,而不是失败或过去的测试

创建类A是为了做一些事情,如果它没有得到任何反馈,无论是使用新的关键字还是在Spring中设置额外的文件,那么类A将不会做任何工作

关于代码模块化、可读性和可维护性的想法:因此业务类变得更干净,但我们所做的只是将混乱从肮脏的Java业务类转移到复杂的XML文件,并删除用于注入松散对象的接口

简言之,似乎我们必须在某个地方对文件进行编辑和更改,对吗


如果我缺乏理解,请随意将我放在我的位置上,只是对学习Spring有点恼火,因为我看到同样数量的工作刚刚被重新安排。

依赖注入对于单元测试很好,因为您可以单独测试每个方法,而不需要依赖于任何其他方法。这样,每个单元测试就可以只测试一种方法


我想说的是,如果xml是令人讨厌的东西,那么您可以查看SpringBoot。它基于java配置,因此没有xml,并且它根据类路径简化了许多配置。当我第一次启动spring时,我发现来自java背景的xml非常令人望而生畏,但是spring boot完成的基于注释的配置和自动配置对于快速让应用程序工作非常有帮助

我认为使用spring的最大优势是依赖注入,它使您的生活变得轻松。例如,如果您想创建一个具有三个依赖项的新服务,那么可以使用Spring非常轻松地创建一个类。但是如果没有spring,您将最终编写不同的工厂方法,这些方法将返回您正在寻找的实例。这使得静态方法调用的代码非常冗长。您可能想看看spring纪元之前的代码存储库

同样,您是否想使用Spring取决于项目的复杂性。但它的其他特点/优势不容忽视


XML文件或Java配置是实现spring配置的方法——您希望在其中添加业务逻辑是个人风格的。唯一的问题是,在整个项目中,你们都应该保持一致

我建议您阅读Martin Fowler关于的伟大文章,以便更好地理解为什么像Spring这样的框架在编写软件时对于解决一组众所周知的常见依赖注入问题非常有用

正如其他人所提到的,没有义务使用Spring;无论您能用Spring做什么,您都可以通过其他方式来做,比如抽象工厂、工厂方法或服务定位器

如果您的项目足够小,那么您可能不介意自己使用上面提到的一些设计模式来解决依赖项注入问题。然而,根据项目的大小,许多人更愿意使用一个框架或库,该框架或库已经打包了一系列解决方案来解决这些重复出现的难题

关于依赖项注入框架在进行单元测试时的优势,您不需要测试类的依赖项,只需要测试类

例如,您的应用程序很可能具有分层设计。使用数据访问类或存储库从数据源检索数据是非常常见的。从逻辑上讲,您也有一个使用DAO的类

显然,您已经为您的DAO编写了单元测试,因此,当您测试您的业务类(使用DAO的地方)时,您并不关心再次测试DAO

幸运的是,由于Spring需要对DAO进行某种形式的依赖注入,这意味着您的类必须提供一个构造函数或setter方法,我们可以通过它将DAO注入到我们的业务类中,对吗

那么,在对业务类进行单元测试期间,您可以方便地使用这些注入点来注入您自己的伪DAO(即模拟对象)。这样,您就可以专注于业务类的测试,而不用再重新测试DAO了

现在,将此想法与您自己可能采用的其他解决方案进行比较:

  • 通过在业务类中实例化DAO,可以直接注入依赖关系
  • 在代码中使用静态工厂方法来访问DAO
  • 在代码中使用来自服务定位器的静态方法来访问DAO
所有这些解决方案都不会使您的代码易于测试,因为在测试业务类时,没有简单的方法可以精确选择要注入到业务类中的依赖项(例如,如何更改静态工厂方法以使用假DAO进行测试?)

因此,在Spring中,使用XML配置或注释,您可以很容易地根据多种条件将不同的依赖项注入到服务对象中。例如,您可能有一些用于测试的配置,这些配置显然与生产中使用的配置不同。如果您有一个登台环境,您的应用程序甚至可能有不同的依赖项XML配置,这取决于它是在生产环境还是集成环境中运行

在我看来,依赖项的可插拔性是这里的关键获胜因素

所以,正如我刚才所说的,我的建议是,首先要扩大对SpringCore(通常是所有依赖注入框架)试图解决的问题的理解,以及为什么它很重要,这将给您带来好处