Ioc或DI的核心思想在于提供一个更加简单的机制来规定组件之间的依赖关系(一般涉及到对象的合作),并且在它们生命周期中对依赖关系进行管理。 Ioc提供了这样的服务,使一个组件能够在它的生命周期中访问它的依赖和服务。总的来说,IoC能够被分解为两种字类型:依赖注入和依赖查找。从这个意义上来说,当我们谈及DI的时候总是在谈IoC,但是当说到IoC的时候却不一定涉及DI.
控制反转的类型:依赖注入和依赖查找
Dependency Lookup是一种更加传统的方法,一个组件必须获得一个依赖的参考。其实现分为:依赖拖拽和上下文配置。Dependency Injection相对新一些,事实上它比 依赖查找更加富有弹性且有用。其实现有构造器依赖注入和Setter依赖注入。
依赖拖拽Dependency Pull:依赖关系是根据需要从一个登记处获取(拖拽)出来。Spring提供了依赖拖拽作为从框架管理的组件中重新获取组件的一种机制。
上下文配置依赖查找Contextualized Dependency Lookup(CDL):是在容器管理的资源中进行的,而不是从一个集中的注册处,同时它一般在规定点执行。
构造器依赖注入:Constructor Dependency Injection:就是在组件的构造器处体供依赖关系的注入,IoC容器会在实例化它的时候将依赖关系传送给它。
Setter依赖注入:Setter Dependency Injection:IoC容器通过JavaBean形式的方法将组件的依赖关系注入到组件。组件的Setter方法将一组依赖关系暴露给IoC容器,并受之控制。实际上,Setter 注入是最广泛的注入机制,也是最容易实现的IoC 机制之一。
注入对查找Injection vs. Lookup:大部分情况下选择注入。使用依赖,可以自由地使用完全与IoC容器解耦的类,可以手动设定各个独立对象之间的协作关系。而在查找的方式下,你的类总是依赖于容器定义的特定类和接口。查找的另一个缺点是很难脱离容器来测试你的代码。使用 注入,测试你的组件将变得非常轻松,因为你只需要通过适当的构造器和Setter来设定它们之间的关系。其次查找的解决方案比注入复杂的多。最重要的是注入来代替查找将会使你的生活变得更加轻松。
Setter Injection vs. Construtor Injection:总的来说,基于Setter的依赖注入是最佳选择,因为它在非IoC的设置下对你的代码 影响最小。构造器注入,当你需要确认依赖关系将被传递给组件的时候,是一个不错的选择。但是要记住很多容器为这种情况提供了它们自己的基于Setter依赖注入的机制。