简单的例子解释IOC控制反转进行解耦合

一、相关概念
(1)解耦合
解耦合就是把程序中互相不相关或有限相关的模块分割开来,把不同模块互相之间的关系用接口进行准确定义,解耦前,两个模块之间共享所有信息;
(2)作用
解耦后,需要共享的信息呗准确地定义在接口中,并确定信息的流向,解耦合可以令程序变得清晰,把不该暴露的实现细节隐藏,使代码的修改简单化,同时使程序结构灵活,通过静态多态或动态多态,一个模块可以和任意实现接口的模块协作,系统扩展性大大增强。消除编译依赖,调试也相应简易,只要模块对一个接口调试成功,其他的接口也将没有问题
(3)控制反转
① 软件系统在没有引入IoC容器之前,对象A依赖对象B,那么A对象在实例化或者运行到某一点的时候,自己必须主动创建对象B或者使用已经创建好的对象B,其中不管是创建还是使用已创建的对象B,控制权都在我们自己手上。
②如果软件系统引入了Ioc容器之后,对象A和对象B之间失去了直接联系,所以,当对象A实例化和运行时,如果需要对象B的话,IoC容器会主动创建一个对象B注入到对象A所需要的地方。
③ 通过前面①②的对比,可以看到对象A获得依赖对象B的过程,由主动行为变成了被动行为,即把创建对象交给了IoC容器处理,控制权颠倒过来了,这就是控制反转的由来!
注:在控制反转与解耦过程中使用了设计模式中的工厂模式。

(4)工厂模式
工厂模式是指当应用程序中甲组件需要乙组件协助时,并不是在甲组件中直接实例化乙组件对象,而是通过乙组件的工厂获取,即该工厂可以生成某一类型组件的实例对象。在这种模式下,甲组件无需与乙组件以硬编码的方式耦合在一起,而只需与乙组件的工厂耦合
二、Spring底层中使用了IOC的模式,此处用程序简单的介绍其原理
(1)xml文件(beans.xml),用于存储DAO,Service层的具体实现类名称以及class所在权限路径
代码如下:

<xml-body>
<beans><bean id="ProductService" class="com.itheima.service.impl.ProductServiceImpl"></bean><bean id="UserService" class="com.itheima.service.impl.UserServiceImpl"></bean><bean id="CategoryService" class="com.itheima.service.impl.CategoryServiceImpl"></bean><bean id="OrderService" class="com.itheima.service.impl.OrderServiceImpl"></bean><bean id="ProductDao" class="com.itheima.dao.impl.ProductDaoImpl"></bean><bean id="UserDao" class="com.itheima.dao.impl.UserDaoImpl"></bean><bean id="CategoryDao" class="com.itheima.dao.impl.CategoryDaoImpl"></bean><bean id="OrderDao" class="com.itheima.dao.impl.OrderDaoImpl"></bean>
</beans>
</xml-body>

(2)工厂类(BeanFactory),运用反射的原理实例化对象
此处反射机制需要导入”dom4j-1.6.1.jar“jar包,代码如下:

package com.itheima.utils;import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;public class BeanFactory {public  static Object getBean(String id)
{try {//获取document对象Document doc=new SAXReader().read(BeanFactory.class.getClassLoader().getResourceAsStream("beans.xml"));//获取指定的bean对象Element ele= (Element) doc.selectSingleNode("//bean[@id='"+id+"']");//获取bean对象的class属性String value=ele.attributeValue("class");//反射return Class.forName(value).newInstance();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}return null;
}public static void main(String[] args)
{System.out.println(getBean("OrderDao"));System.out.println(getBean("OrderService"));
}
}

(3)View层中,实现注入
此处为手动注入,即调用BeanFactory返回实例化对象,代码如下:

ProductService ps=(ProductService) BeanFactory.getBean("ProductService");

(4)在main函数中验证

mainpublic static void main(String[] args)
{System.out.println(getBean("OrderDao"));
System.out.println(getBean("OrderService"));
}

三、总结
通过工厂类的控制反转,在改变DAO层不同的应用方法(比如jdbc转化为hibernate框架)时,无需更改代码,只需更该配置文件的class名称及class的路径

Spring底层控制反转解耦合(IOC)相关推荐

  1. java-12:spring MVC - 控制反转IOC,依赖注入DI

    学习spring框架之前,先理解几个概念: 1.第一部分:依赖倒置原则 2.第二部分:控制反转,控制反转容器(实例) 3.第三部分:控制反转,控制反转容器(全面理解,面试题) 综合性理解:控制反转(I ...

  2. Spring的控制反转(IOC)和依赖注入(DI)具体解释

    Spring的控制反转(IOC)和依赖注入(DI)具体解释 首先介绍下(IOC)控制反转: 所谓控制反转就是应用本身不负责依赖对象的创建及维护,依赖对象的创建及维护是由外部容器负责的.这样控制器就有应 ...

  3. Spring中控制反转IoC理论推导

    Spring中的IoC是一种思想.所谓控制反转,也就是从创建对象的主动权在程序员手中,到创建对象的主动权在用户手中.控制反转官方定义是一种通过描述(XML或注解)并通过第三方生产或获取特定对象的方式, ...

  4. Spring 的控制反转/依赖注入

    第一章 Spring 的控制反转/依赖注入 回顾 增删改查. 课前测: 本章内容 spring:春天 IOC:将创建对象的权力交给 spring 核心容器去控制.工厂模式 BeanFactory: 懒 ...

  5. Spring的控制反转与依赖注入

    学习过Spring的都知道Spring有三大核心的概念,分别是控制反转(IOC).依赖注入(DI)和面向切面编程(AOP).今天就来聊聊我对控制反转和依赖注入的了解,至于面向切面编程放到后面讲解. 一 ...

  6. spring的控制反转和依赖注入讲解

    1.Spring 1.1 简介 2002年首次推出Spring的雏形,interface21框架 2004正式发布1.0版本 解决企业应用开发的复杂性,其理念是使现有的技术更加容易使用! SSH:St ...

  7. SSM框架—Spring基础—控制反转和依赖注入(概念)

    控制反转: 控制反转(IoC)是面向对象编程的一个设计原则,用于降低代码耦合度 在传统面向对象编程中,获取对象的方式是用关键字"new"主动创建一个对象,也就是说,应用程序掌握着对 ...

  8. 控制反转_Spring:IOC 控制反转

    Spring 概述 Spring 是什么 Spring 是分层的 Java SE/EE 应用 full-stack (全栈式) 轻量级开源框架. 全栈式:对各种主流技术和框架都进行了整合,同时对三层架 ...

  9. Spring的控制反转以及依赖注入,控制反转使程序具有高拓展性。

    1. 控制反转(Inversion of Control, IOC) 将对象的创建.赋值.管理交给容器(Spring),通过xml文件即可修改对象的属性,不必修改源代码,具有高拓展性.各个模块间的对象 ...

最新文章

  1. 一笔画问题 (DFS或并查集)
  2. 条件语句,while循环语句:完整的温度转换程序
  3. linux多线程计算pi,使用蒙特卡洛方法多线程计算pi值
  4. 数据结构----------实现最小堆排序
  5. mysql索引 和 es索引_MySQL索引 VS ElasticSearch索引
  6. @RequestParam详解
  7. 02ODBC基本概念
  8. Kafka单机安装Version1.0.1(自带Zookeeper)
  9. CentOS简单上手——第四篇
  10. uniapp 微信小程序获取map地图中心的经纬度地理位置
  11. Java项目:自习室图书馆座位预约管理系统(java+SSM+JSP+easyUI+mysql)
  12. 虚拟化服务器端口用万兆,虚拟化升级,千兆变万兆!
  13. 车辆出险保险索赔技巧——让每个车友都能学习
  14. wordpress如何制作一个跟随滑动的文章目录?Content Index文章目录插件修改篇
  15. 网格环境配置(三):安装SGE
  16. excel表格末尾添加一行_教你使用Python批量读写excel文件
  17. 中奖名单 | “爱码士”,你好
  18. Linux svn checkout命令使用示例
  19. 关于农业生态链平台的杂想
  20. 012 Rust死灵书之分解借用

热门文章

  1. JAVA入门: Annotation
  2. 递归 将一个整数逆序
  3. python获取屏幕文字_详解:四种方法教你对Python获取屏幕截图(PyQt , pyautogui)...
  4. linux 内核主线,为AM335x移植Linux内核主线代码(41)Ethernet结论篇
  5. python 字符串分割_python中分割字符串split切割并选择输出 逐行读取文件后字符串拼接...
  6. Unity3D之Shader自定义编辑器功能拓展
  7. C#中字符串的内存分配与驻留池
  8. HDU 4035 Maze
  9. Linux命令基础3
  10. BZOJ3795 : 魏总刷DP