Spring底层控制反转解耦合(IOC)

简单的例子解释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的路径

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/250033.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Manacher算法学习笔记 | LeetCode#5

Manacher算法学习笔记 DECLARATION 引用来源&#xff1a;https://www.cnblogs.com/grandyang/p/4475985.html CONTENT 用途&#xff1a;寻找一个字符串的最长回文子串时间复杂度&#xff1a;O(N)算法步骤&#xff1a; 1.添加特殊字符 由于回文串的长度可奇可偶&#xff0c;比如…

content-type对照表

转载于:https://www.cnblogs.com/mxyr/p/9238329.html

【算法小积累】 - 提取非0数最右侧的1

参考 - 69:49 const getRightOne num > {return num & (~num 1); };

解耦合

广大程序猿同胞&#xff0c;经常会看到“解耦合”&#xff0c;也有很多人&#xff0c;会用这个词来装X&#xff0c;但是&#xff0c;实际真正能理解的人&#xff0c;并不多。接下来&#xff0c;带大家深入浅出的走一遍&#xff0c;如何解耦合。 首先&#xff0c;我们要知道&am…

CentOS安装和配置Rsync进行文件同步

Liunx系统实现文件同步不需要搭建FTP这类的工具&#xff0c;只需要按照Rsync配置下文件就可以。 本文以Centos7.0为例。 1. 首先关闭SELINUX&#xff08;不关闭无法同步&#xff0c;权限太高了&#xff09; vi /etc/selinux/config #编辑防火墙配置文件 #SELINUXenforcing #注释…

【linux】 -设备名称与文件目录

参考 - 鸟哥的linux私房菜基础篇 在linux系统中,每个设备都被当成一个文件来对待几乎所有的硬件设备文件都在/dev这个目录内 下面给出,常见设备和文件路径的对应关系 设备设备在Linux中的文件名SCSI、SATA、USB磁盘驱动器/dev/sd[a-p]U盘/dev/sd[a-p] (与SATA相同)Virtio接口/…

数据结构开发(7):典型问题分析(Bugfix)

0.目录 1.创建异常对象时的空指针问题 2.LinkList 中的数据元素删除 3.LinkList 中遍历操作与删除操作的混合使用 4.StaticLinkList 中数据元素删除时的效率问题 5.StaticLinkList 是否需要提供析构函数&#xff1f; 6.StLib 是否有必要增加多维数组类&#xff1f; 1.创建异常对…

spring boot 使用视图modelandview

1&#xff1a;springboot使用视图解析器&#xff0c;添加依赖 <!-- freemarker模板引擎视图 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-freemarker</artifactId></dependency>&…

题解-BOI 2004 Sequence

Problem bzoj & Luogu 题目大意&#xff1a; 给定序列\(\{a_i\}\)&#xff0c;求一个严格递增序列\(\{b_i\}\)&#xff0c;使得\(\sum \bigl |a_i-b_i\bigr|\)最小 Thought 正序&#xff1a;直接对应 逆序&#xff1a;取中位数&#xff08;证明&#xff1a;“医院设置”&am…

【vscode】编译java时报错乱码

报错如下 解决方案 改变终端的编码格式 chcp 946注意: chcp 65001 UTF-8编码chcp 936 GBK2312代码页

搭建集群架构

环境搭建进行规划(磨刀不误砍柴工). 集群架构组成说明. 负载均衡服务器使用Nginx做搭建,(nginx反向代理软件) Nginx01<-------->Nginx02 3台Web网站服务器,Nginx网站web服务功能 2台负载均衡服务器 (对网站的流量进行分流,减少流量对某台服务器的压力) 3台web服务器, (处…

Model、ModelMap和ModelAndView的使用详解

1.前言 最近SSM框架开发web项目&#xff0c;用得比较火热。spring-MVC肯定用过&#xff0c;在请求处理方法可出现和返回的参数类型中&#xff0c;最重要就是Model和ModelAndView了&#xff0c;对于MVC框架&#xff0c;控制器Controller执行业务逻辑&#xff0c;用于产生模型数据…

【mysql】- 初始化

参考 1、写配置文件 在mysql的根目录下创建 my.ini&#xff0c;根目录的截图和输入的内容如下所示。 my.ini的内容如下 [mysql] default-character-setutf8[mysqld] character-set-serverutf8 default-storage-engineINNODB sql_modeSTRICT_TRANS_TABLES,NO_ZERO_IN_DATE,…

【FBI WARNING】一些Noip的黑科技 持续整理!

有疑问或错误尽管评论&#xff01;&#xff01; 下面以C为准。 本文手&#xff08;粘&#xff09;打&#xff08;贴&#xff09;于各大博客之间 有问题。。。。。 我也不懂 max、min的优化 我们知道&#xff0c;打max、min时&#xff0c;要用分支&#xff08;if语句&#xff09…

@PathVariable注解使用

PathVariable是spring3.0的一个新功能&#xff1a;接收请求路径中占位符的值 语法&#xff1a; PathVariable("xxx") 通过 PathVariable 可以将URL中占位符参数{xxx}绑定到处理器类的方法形参中PathVariable(“xxx“) RequestMapping(value”user/{id}/{name}”) 请…

【mysql】- 常用命令

DML - 操作表 SELECT * FROM stu;INSERT INTO stu ( id, NAME ) VALUES ( 1, 张三 );INSERT INTO stu ( id, NAME, sex, birthday, score, email, tel, STATUS ) VALUES( 2, 李四, 男, 1999-11-11, 88.888, lisiitcase.cn, 13812345678, 1 );update stu set sex 女 where nam…

JAVA 框架-Spring-AOP面向切面

AOP&#xff08;Aspect Orient Programming&#xff09;&#xff0c;我们一般称为面向方面&#xff08;切面&#xff09;编程&#xff0c;作为面向对象的一种补充&#xff0c;用于处理系统中分布于各个模块的横切关注点&#xff0c;比如事务管理、日志、缓存等等。AOP实现的关键…

互相关和卷积的关系

转载于:https://www.cnblogs.com/seisjun/p/10134021.html

Thymeleaf3语法详解

Thymeleaf是Spring boot推荐使用的模版引擎&#xff0c;除此之外常见的还有Freemarker和Jsp。Jsp应该是我们最早接触的模版引擎。而Freemarker工作中也很常见&#xff08;Freemarker教程&#xff09;。今天我们从三个方面学习Thymeleaf的语法&#xff1a;有常见的TH属性&#x…

【mysql】约束、外键约束、多对多关系

1、约束 DROP TABLE IF EXISTS emp;-- 员工表 CREATE TABLE emp (id INT PRIMARY KEY auto_increment, -- 员工id,主键且自增长ename VARCHAR(50) NOT NULL UNIQUE, -- 员工姓名,非空并且唯一joindate DATE NOT NULL, -- 入职日期,非空salary DOUBLE(7, 2) NULL, -- 工资,非空…