简单来说,依赖查找是主动和手动的依赖查找方式,通常需要依赖容器和标准api去实现;而依赖注入则是手动或自动依赖绑定的方式,无需依赖特定的容器和api。
一、依赖查找
依赖查找(Dependency Lookup,简称 DL),它是控制反转设计原则的一种实现方式。它的大体思路是:容器中的受控对象通过容器的 API 来查找自己所依赖的资源和协作对象。这种方式虽然降低了对象间的依赖,但是同时也使用到了容器的 API,造成了我们无法在容器外使用和测试对象。依赖查找是一种更加传统的 IOC 实现方式。
依赖查找也有两种方式:
- 依赖拖拽:注入的对象如何与组件发生联系,这个过程就是通过依赖拖拽实现;
- 上下文依赖查找:在某些方面跟依赖拖拽类似,但是上下文依赖查找中,查找的过程是在容器管理的资源中进行的,而不是从集中注册表中,并且通常是作用在某些设置点上;
二、依赖注入
依赖注入有三种方式:构造函数方法注入、Setter方法注入、接口注入和基于注解的依赖注入
构造函数注入:
setter方法注入:
接口注入:
spring还提供了基于注解的注入:
Spring主要提供了@Autowired和@Resource注解模式,下面也重点讨论这两种注解模式。
@Autowired 注解,可以对Bean类成员变量、方法及构造函数进行标注,完成依赖注入的自动装配工作。使用@Autowired可以省略Bean类的待依赖注入对象的set方法,@Autowired默认情况下按照依赖注入对象的类型自动进行匹配。加入@Autowired注解的方式是在Bean类依赖注入对象的前面加上@Autowired语句。
@Autowired还提供required的属性,用来处理当注入的Bean实例不存在的情况。required为true时,如果注入的Bean实例不存在,程序会抛出异常;required为false时,如果注入的Bean实例不存在,程序会忽略。由于默认情况下@Autowired是按类型匹配的(byType),如果需要按名称(byName)匹配,可以使用@Qualifier注解与@Autowired结合。
@Resource注解的功能和@Autowired注解功能相近,@Resource有name和type两个主要的属性。Spring容器对于@Resource注解的name属性解析为bean的名字,type属性则解析为bean的类型。因此使用name属性,则按byName模式的自动注入策略,如果使用type属性则按 byType模式自动注入策略。如果两个属性都未指定,Spring容器将通过反射技术默认按byName模式注入。