文档章节

关于依赖反转(基于接口编程)和依赖注入的一个小问题的领悟

猪刚烈
 猪刚烈
发布于 2014/10/12 11:40
字数 1235
阅读 9
收藏 0

  这两天学习设计模式,看到了关于依赖反转方面的东西,就依赖反转而言简单来说就是:软软设计存在抽象层和实现层之分,一般情况下是抽象依赖于实现,这很容易理解,但是问题在于抽象层相对稳定,实现层容易变化,抽象层应该具有较实现层更高的复用性,它就应该我们设计和考量的核心与重点,而不是具体的实现,这样一来,要求我将依赖关系反转过来,即实现应该依赖于我们的抽象,这样的设计才是灵活和易于扩展的。如此一来,依赖反转的概念就出来了,但是如果实现依赖反转呢?答案听上去是很简单的那就是基于接口进行编程,关于这一点在许多讲述设计模式的书中都有所介绍,接口是对类和方法的一组需求定义,由于接口不提供任何实现,它是一种最纯的抽象,基于接口进行编程可以真正意义上实现在抽象层上进行工作。但是还有一个恼人的小问题:

interface IService

{

 public void doSomething();

}

class ServiceImpl implements IService

{
 public void doSomething()
 {
  // do something......
 }
}

class Component
{

private  IService service=new ServiceImpl(); //这里是基于接口进行编程,但却在构造时与具体的实现发生了耦合

//后继方法中会使用该service

}

问题就出在对service的实例化上,我们可以明确的看到接口service在实例化时要不可避免地使用到它的实现类,从而导致了 service至少在创建时刻对具体实现产生了依赖,这使得我们之前打算的基于接口进行编程的工作似乎功亏一篑。在一些设计模式的书中对于这一问题的解决方法是使用工厂模式,来实现对service实例化的封装。

  呵呵,写到这里禁不住要偷笑了,因为晚上在思考这个问题的时候实然想到了spring的依赖注入,不禁恍然大悟:不需使用什么工厂模式,运用spring的依赖注入会完美地解决“抽象在创建时刻对实现产生依赖”的问题,在我们代码里,抽象将永远不需要再被指向他的具体实现了,这个过程会放到sping 的配制文件里,使用依赖注入的方式完成,这样了,我们真得就可以完美使用接口进行编程了!

 

 

以下内容是2010-5-8的补充:

 

     在我刚开始接触spring和IOC理论时,最常见的IOC示例就是Service依赖DAO时,在Service的实现类里声明一个DAO字段,通常这个DAO是一个接口,然后提供一个setter,就在Service的方法中开始使用这个DAO了,整个Service没有实例化这个DAO的操作。其实这个示例展示了两点:一个是依赖注入,另一个是基于抽象编程。我当时一直认为:只有在基于抽象编程的前提下,进行依赖注入才是有意义的。否则声明的是一个具体类,再注入一个具体类有什么意义呢?这是我三年前对IOC的认识。

    后来,我研究一个IOC框架PicoContainer:http://www.picocontainer.org/,这个IOC构架的参考文档让我对IOC有了更进一步的认识,也使我发现了我过去对IOC认识的一个局限。本质上讲,IOC之所以如此重要,是因为它解决了OO技术中一个重要的缺失:如何合理地创建对象并将它们关联起来协同工作。面向对象技术注重于对对象属性与行为的模拟,对这些对象从何而来,怎样相互依赖缺乏合理的模拟机制。很多时候,当一个对象A依赖到另一个对象B时,我们就new一个B的实例出来。这样做在有些时候是合理的,有些时候就是不恰当的。上面提及的基于抽象编程时就是一种情况。还有其他的情况。比如:A有没有创建B的责任?如果A没有创建B的责任,那么就不应该让A来承担。这是OO设计的一个重要原则:Designing Objects with Responsibilities。关于这一点,《Applying UML and Patterns, 3rd Edition》一书17.10节有详尽的说明。

   总之IOC就像一个系统的对象容器和粘合剂,它负责创建对象的实例,并按照它们声明的依赖关系把它们粘合起来共同工作。

本文转载自:http://blog.csdn.net/bluishglc/article/details/1680293

共有 人打赏支持
猪刚烈
粉丝 22
博文 708
码字总数 110
作品 1
海淀
程序员
私信 提问
关于Laravel的核心分析

最近一段时间在研究laravel的底层源码,既然这样那得从开头说起,于是去了laravel学院看看别人写的关于laravel的核心分析,链接如下: Laravel 服务容器实例教程 —— 深入理解控制反转(IoC...

全栈coder
2017/03/10
0
0
Spring-Spring相关术语-01

Spring-Spring相关术语-01 1.1 什么是Spring spring框架是分层的JavaSE/EEfull-stack(一站式)轻量级开源框架。本质是一个容器。 l 分层:JavaEE分层来源JavaEE规范体系结果 l 一站式:spr...

守望者禾
2017/10/06
0
0
那些年搞不懂的高深术语——依赖倒置•控制反转•依赖注入•面向接口编程

那些年,空气中仿佛还能闻到汉唐盛世的余韵,因此你决不允许自己的脸上有油光,时刻保持活力。然而,你一定曾为这些“高深术语”感到过困扰。也许时至今日,你仍对它们一知半解。不过就在今天...

wf王帆
2016/05/26
28
0
Spring-Spring相关术语-01

Spring-Spring相关术语 1.1 Spring概述 spring框架是分层的JavaSE/EEfull-stack(一站式)轻量级开源框架。本质是一个容器。 l 分层:JavaEE分层来源JavaEE规范体系结果 l 一站式:spring框架...

守望者禾
2017/10/06
0
0
控制反转(IOC)与依赖注入(DI)

IOC 和DI,这两个在Java中指的是控制反转和依赖注入;熟悉struts2 , spring的人对于这两个名词都很不陌生; 最近在学习的过程中,又不断的碰到这两个词;而网络上,更多的是对依赖注入的方式...

alex
2013/06/29
0
5

没有更多内容

加载失败,请刷新页面

加载更多

spring源码阅读笔记(一)

ClassPathXmlApplicationContext 与 FileSystemXmlApplicationContext 用了这么久的框架,是时候搞一下源码了,一般最初接触spring 从以下步骤开始 创建一个bean类 并创建 ooxx.xml之类的spr...

NotFound403
9分钟前
0
0
MySQL主从配置

12月14日任务 17.1 MySQL主从介绍 17.2 准备工作 17.3 配置主 17.4 配置从 17.5 测试主从同步 MySQL主从介绍 MySQL主从又叫做Replication、AB复制。简单将就是A/B两个服务器做主从后,在A上写...

robertt15
11分钟前
0
0
我的Linux系统九阴真经

在今天,互联网的迅猛发展,科技技术也日新月异,各种编程技术也如雨后春笋一样,冒出尖来了。各种创业公司也百花齐放百家争鸣,特别是针对服务行业,新型互联网服务行业,共享经济等概念的公...

问题终结者
24分钟前
6
0
Java 使用 gson 对 json 根据 key 键进行排序

引入Google的gson jar <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.8.0</version>......

yh32
25分钟前
1
0
Vue.use源码解析

什么是Vue插件 关于什么是Vue插件大家可以去看官网的解释 ,总得来说就是提供一个全局注册/调用的能力。 怎么用 我们以Weex为例。 首先有一个toast.js const Toast = {}Toast.install = (Vu...

peakedness丶
32分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部