我建议您阅读Martin Fowler关于Inversion of Control and Dependency Injection的伟大文章,以更好地理解为什么像Spring这样的框架在编写软件时能够解决众所周知的一组常见的依赖注入问题。
正如其他人所说,没有义务使用Spring;无论你使用Spring做什么,你都可以通过抽象工厂,工厂方法或服务定位器等其他方式来完成。
如果你的项目足够小,那么你可能不会介意使用上面提到的那些设计模式来自己解决依赖注入问题。但是,根据项目规模的不同,很多人会倾向于使用已经为这些经常性头部划痕器包装了一堆解决方案的框架或库。
关于依赖注入框架在进行单元测试时的优点是你不需要测试你的类的依赖关系,而只需要测试你的类。
例如,很可能您的应用程序具有分层设计。有一个数据访问类或用于从数据源检索数据的存储库是很常见的。从逻辑上讲,你也有一个使用该DAO的课程。
很明显,您已经为您的DAO编写了单元测试,因此,当您测试业务类时(使用DAO的位置),您不必再次测试DAO。
幸运的是,由于Spring需要某种形式的DAO依赖注入,这意味着您的类必须提供一个构造函数或setter方法,通过它可以将该DAO注入到我们的业务类中,对吗?
那么,在您的业务类的单元测试期间,您可以方便地使用这些注入点来注入您自己的假DAO(即模拟对象)。这样,您可以专注于业务类的测试,并忘记重新测试DAO。
现在比较这个想法与其他解决方案,你可能已经在你自己做:
- 您可以直接通过您的业务类中实例化DAO注入的依赖。
- 您可以在代码中使用静态工厂方法来访问DAO。
- 您可以使用代码中服务定位器的静态方法来访问DAO。
这些解决方案将使你的代码易于测试,因为没有简单的方式选择正是依赖我想注入到我的商务舱,而测试它的方式获得(例如你怎么改用于测试目的的静态工厂方法使用假DAO?)。
因此,在Spring中,使用XML配置或注释,可以根据许多条件轻松地将不同的依赖关系注入到服务对象中。例如,您可能有一些测试配置,显然与生产中使用的配置不同。如果您有一个临时环境,您甚至可能会为您的应用程序提供不同的XML配置依赖关系,具体取决于它是在生产环境还是集成环境中运行。
依赖关系的可插拔性是我认为的关键赢得因素。因此,正如我刚才所说的,我的建议是,首先扩展您对Spring核心(以及一般所有依赖注入框架)试图解决什么问题的理解以及为什么它很重要,并且这会给你更广泛的视角和理解这些问题的方式,你可以确定什么时候使用Spring是一个好主意,什么时候不使用。
你是什么意思“产生零的测试结果,而不是失败或过去的测试”? –
我之前没有进行过单元测试,所以我来自这样的想法,即当我编写一个类时,通常需要其他东西来产生任何有意义的结果。我认为,如果我的课需要一些数据,而且我不会说任何其他课,那么我的测试没有给出任何结果,我想如果我写了任何错误,编译器会好心让我知道。也许我有不好的设计实践。 – WPW
如果你只是寻找依赖注入,然后使用普通的简单设计模式(或类似Guice)。然而,春天是一个为最小配置提供各种集成组件的生态系统。通过他们我们现在我们赞成通过XML的注释。 – Rafa