我还在学习Spring框架,并且我试图真正理解何时以及如何使用依赖注入
是否应通过接口管理所有依赖项?
答案 0 :(得分:2)
使用接口来暴露某种API并且具有可能需要换出的实现的依赖项(例如,在单元测试中使用模拟)。一个常见的情况是DAO(数据访问对象),它在Spring Data中称为存储库,它将您的数据模型绑定到持久层。另一种常见情况是服务,它会在您的域模型上公开操作。通常,服务将依赖于数据访问层,因此要对服务进行单元测试,您将模拟DAO /存储库。另一个例子是第三方服务;这些通常仅供生产系统使用,但必须在开发和测试环境中进行模拟。在这种情况下,接口远远优于在代码中嵌入布尔标志,并希望您不会出现任何逻辑错误。
要记住管理依赖关系的关键是实际管理new
关键字的使用。只要您使用new
,就会在实现上创建依赖关系。依赖注入的目标是分离您使用依赖的内容与 它们的方式。您可以依赖于接口或类,原因很简单明显:Java支持子类化。因此,即使您依赖于类而不是接口,也可能最终得到子类。在许多情况下,Spring框架实际上会自动执行此操作。
如果您发现自己需要创建对象并且您不确定是否应该依赖它们,请让您的依赖注入框架为这些对象提供Factory。它的工作原理显然取决于框架,但我所知道的所有框架都支持工厂。如果您不使用框架,您仍然可以编写工厂并使用它们,而不是一直使用new
。
答案 1 :(得分:1)
如果在不使用spring IOC容器的情况下编写代码,则必须编写一些工厂类来创建对象并将其连接起来。对于示例实例,请考虑具有对DAO实例的引用的服务类。您必须为服务类编写一些初始化工厂,以保证对服务类的单例访问,并确保使用DAO实例实例化服务类。在代码中的每个地方创建新实例都不是一个好习惯,因此使用了工厂模式。但是如果你使用Spring IOC容器,它将处理所有这些事情。通常它会创建单例实例,因此您不需要在代码中使用new
关键字,这样您就可以编写更清晰的代码。使用这种方法,您的代码可以松散耦合并且更易于维护。如果你只有一个公共构造函数,你现在可以自由地进行构造函数注入,而不使用新的spring版本使用@Autowire
入侵注释。
春天使用了三种DI机制,如here所述。建议使用三个构造函数注入,因为它更易于测试并且不会导致任何不变。使用@Autowire
进行现场注入是邪恶的,不推荐使用,因为它不是可测试的解决方案。
希望这会有所帮助。快乐的编码。