耦合性是软件工程中的一个重要概念。对象之间的耦合性就是对象之间的依赖性。对象之间的耦合越高,维护成本越高。因此对象的设计应使类和构件之间的耦合最小。 spring Ioc思想 控制翻转也就是spring所推出的依赖注入

传统的方法假设我们前端用的struts,那么action中我们对业务逻辑的编写一般是这样的

这里是一段伪代码:


publicclass CustomerDao {  publicboolean getCustomerByAccount() {/* 代码 */ }      } 
publicclass LoginAction {  publicvoid execute() {              CustomerDao cdao =new CustomerDao();  boolean b = cdao.getCustomerByAccount();  // 判断          }      }

在LoginAction中,execute内直接实例化了CustomerDao对象,此时,相当于让LoginAction的使用依赖了 CustomerDao,换句话说,如果没有CustomerDao类,LoginAction将无法被编译、测试。另外,如果CustomerDao类 换成另一版本,比如原先的CustomerDao,是访问SQLServer数据库,后面我们又另外编写了CustomerDao2类,访问Oracle 数据库,那么需要将LoginAction内所有出现CustomerDao的地方改为CustomerDao2。非常麻烦。这就是耦合性高的代价。

那么如何降低耦合性呢,我们可以将变化较大的类改成变化较小的接口,然后在action中通过一个工厂类来返回相应的对象。将代码修改为:


publicinterface ICustomerDao {   publicboolean getCustomerByAccount();       } 
publicclass CustomerDao implements ICustomerDao {  publicboolean getCustomerByAccount(){/* 代码 */ }      }  //工厂类publicclass DaoFactory {  publicstatic ICustomerDao getCustomerDao() {  returnnew CustomerDao();          }      } 
publicclass LoginAction {  publicvoid execute() {              ICustomerDao icdao = DaoFactory.getCustomerDao();  boolean b = icdao.getCustomerByAccount();  // 判断          }      }

在上面的程序中,如果需要做CustomerDao的切换,如,从CustomerDao改为CustomerDao2,就只需让CustomerDao2实现"ICustomerDao"接口,然后修改工厂的方法,而不用修改LoginAction内的代码。

LoginAction只需要认识ICustomerDao接口,不需要认识具体的实现类。而接口修改的概率比实现类要低得多。因此,这样编写就降低了程序的耦合性,是一个比较好的方法。

但是,以上方法也不是没有修改的余地。当Dao进行切换时,还是需要修改BeanFactory的源代码,能否避免这个问题呢?可以对DaoFactory进行改进,使得它能为所有类服务。代码如下


publicinterface ICustomerDao {   publicboolean getCustomerByAccount();       } 
publicclass CustomerDao implements ICustomerDao {  publicboolean getCustomerByAccount() {/* 代码 */          }      } 
publicclass BeanFactory {  publicstatic Object getBean(String className) {  return Class.forName(className).newInstance();          }      } 
publicclass LoginAction {  publicvoid execute() {              ICustomerDao icdao = (ICustomerDao)BeanFactory.getBean("CustomerDao");  boolean b = icdao.getCustomerByAccount();  // 判断          }      }

此处使用了反射机制。修改后,需要切换的时候只需在LoginAction内改变类名,工厂内就会自动生成对象返回给LoginAction。在 LoginAction中,由于类名是字符串,因此,就可以将该字符串写在一个配置文件内,让LoginAction读入,这样,当 CustomerDao类名需要切换时,就直接修改配置文件就行了。不用改源代码,模块之间的耦合就完全由配置文件决定。

这种设计方法有一个好处是,BeanFactory类的通用性很强,就可以将其框架化。因此,框架化之后,对象的生成由框架参考配置文件进行,和具 体实现类的源代码无关,将对象生成的控制权由修改不方便的源代码转变为修改相对方便的配置文件与几乎不进行修改的框架进行,这就是控制反转 (Inverse Of Control,IOC)的原理。

Spring 依赖注入(控制反转)介绍的更多相关文章

  1. Helloworld之Spring依赖注入/控制反转(DI/IoC)版

    Helloworld之Spring依赖注入/控制反转(DI/IoC)版 作者:雨水, 日期:2014-10-29 摘要:本文主要用于培训刚開始学习的人理解Spring中的依赖注入的基本概念. 先介绍依 ...

  2. Spring 依赖注入控制反转实现,及编码解析(自制容器)

    定义: 在运行期,由外部容器动态的将依赖对象动态地注入到组件中. 两种方式: 手工装配 -set方式 -构造器 -注解方式 自动装配(不推荐) 1利用构造器 2set方法注入 dao: package ...

  3. C#依赖注入控制反转IOC实现详解

    原文:C#依赖注入控制反转IOC实现详解 IOC的基本概念是:不创建对象,但是描述创建它们的方式.在代码中不直接与对象和服务连接,但在配置文件中描述哪一个组件需要哪一项服务.容器负责将这些联系在一起. ...

  4. PHP关于依赖注入(控制反转)的解释和例子说明

    PHP关于依赖注入(控制反转)的解释和例子说明 发表于2年前(2014-03-20 10:12)   阅读(726) | 评论(1) 8人收藏此文章, 我要收藏 赞2 阿里云双11绽放在即 1111 ...

  5. spring依赖注入(反转控制)

    SPRING依赖注入机制(反转控制)解析 Spring能有效地组织J2EE应用各层的对象.不管是控制层的Action对象,还是业务层的 Service对象,还是持久层的DAO对象,都可在Spring的 ...

  6. Spring进阶之路(1)-Spring核心机制:依赖注入/控制反转

    原文地址:http://blog.csdn.net/wangyang1354/article/details/50757098 我们经常会遇到这样一种情景,就是在我们开发项目的时候经常会在一个类中调用 ...

  7. Benefits of Using the Spring Framework Dependency Injection 依赖注入 控制反转

    小结: 1. Dependency Injection is merely one concrete example of Inversion of Control. 依赖注入是仅仅是控制反转的一个具 ...

  8. laravel5.2总结--服务容器(依赖注入,控制反转)

    1.依赖 我们定义两个类:class Supperman 和 class Power,现在我们要使用Supperman ,而Supperman 依赖了Power class Supperman { p ...

  9. 依赖注入&控制反转

    IoC——Inversion of Control  控制反转DI——Dependency Injection   依赖注入 要想理解上面两个概念,就必须搞清楚如下的问题: 参与者都有谁? 依赖:谁依 ...

  10. MVC 依赖注入/控制反转

    http://www.cnblogs.com/cnmaxu/archive/2010/10/12/1848735.html http://www.cnblogs.com/artech/archive/ ...

随机推荐

  1. 1.0 python-client以及ui自动化介绍

     appium的client-----捕获元素和对元素进行操作都是在client里面去写脚本实现的,client会将你写的python脚本发送到appium server上,然后appium serv ...

  2. day02-python基础2

    操作 列表是用来存储一组数据,可以实现对列表中元素的增删改查等操作. 转换: list(string):把字符串转为列表 声明: 列表使用方括号 查询: 根据元素下标获取列表中元素的值 切片: [0: ...

  3. winform小知识

    1.得到控制台或者winform程序在debug目录下生成的exe路径 建议使用:AppDomain.CurrentDomain.BaseDirectory或者Assembly.GetExecutin ...

  4. Python网络编程(子进程的创建与处理、简单群聊工具)

    前言: 昨天我们已经了解了多进程的原理以及它的实际使用 Unix/Linux操作系统提供了一个fork()系统调用,它非常特殊.普通的函数调用,调用一次,返回一次, 但是fork()调用一次,返回两次 ...

  5. 容器基础(一): Docker介绍

    IaaS IaaS阶段, 用户租借基础设施,但是还是需要像以前管理服务器那样,用脚本或者手工方式在这些机器上部署应用.这个过程中当然难免会碰到云端机器和本地机器环境不一致的问题.想想每一次同步不同机器 ...

  6. 原始套接字--traceroute

    traceroute, 也就是 trace route,跟踪路由.这个程序最早是Van Jacobson实现的.源码在网上可以找到,不过我还没有去找.是IP路由过程中对数据包TTL(Time to L ...

  7. php + ajax实现 帖子点赞功能

    知识: 一.首先页面需要加载jquery框架 二.ajax常用参数解释: ①.type:传输数据方式,get或者post ②.url:处理数据的PHP脚本 ③.data:传输的数据索引及值,值用js获 ...

  8. jquery radio 行选中 操作

    想实现点击一行中任意位置 此行的 radio 选中. function rowClick(t) { var id = $(t).attr("id").substr(3, 1); / ...

  9. [bzoj5287] [HNOI2018]毒瘤

    题目描述 从前有一名毒瘤. 毒瘤最近发现了量产毒瘤题的奥秘.考虑如下类型的数据结构题:给出一个数组,要求支持若干种奇奇怪怪的修改操作(比如区间加一个数,或者区间开平方),并支持询问区间和.毒瘤考虑了n ...

  10. [经验分享]WeTouch中使用VueInputCode

    如果你想在WeTouch中使用以下输入框的效果,需要做以下几个步骤: 第一步:安装Node.js 第二步:使用Npm在全局安装vue-input-code ,使用命令提示符,在Node安装根目录输入以 ...