在Spring框架中,依赖注入(Dependency Injection, DI)和依赖发现(Dependency Lookup)是两个不同的概念,它们都是实现控制反转(Inversion of Control, IoC)的方式,但操作机制和使用场景有所不同:
依赖注入 (Dependency Injection)
1、定义:依赖注入是一种设计模式,它允许我们去除硬编码的依赖关系,并让外部实体(如Spring容器)来负责创建对象的依赖关系并注入到需要它们的对象中。这意味着对象不需要自己寻找依赖,而是依赖被传递给它们。
2、特点:
透明性:对象的使用者不需要知道依赖是如何被创建和管理的。
可测试性:便于单元测试,因为依赖可以轻松替换为模拟对象。
灵活性:更改依赖关系只需修改配置,无需修改代码。
实现方式:可以通过构造器注入、setter方法注入或字段注入来实现。
依赖发现 (Dependency Lookup)
1、定义:依赖发现是指组件在运行时主动查找并获取其依赖的过程。在Spring中,这通常意味着使用如ApplicationContext的API来查找bean。
2、特点:
主动性:与依赖注入的被动接收不同,依赖发现要求组件主动查找依赖。
灵活性:在某些动态场景下,可能需要在运行时决定依赖,这时依赖发现提供了灵活性。
复杂性:增加了代码的复杂度,因为组件需要知道如何查找依赖,这可能违反了单一职责原则。
实现方式:通过ApplicationContext.getBean()方法来查找并获取Bean实例。
总结:
依赖注入是Spring推荐的主要依赖管理方式,因为它促进了松耦合、易于测试和维护的代码结构。而依赖发现虽然提供了运行时的灵活性,但通常不建议常规使用,因为它违背了IoC的基本原则,即组件不应该负责查找它们的依赖。在大多数情况下,依赖注入能满足应用的需求,并保持代码的清晰和可维护性。