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.pswp.cn/news/250033.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/250033.shtml
英文地址,請注明出處:http://en.pswp.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, -- 工資,非空…