日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

简述控制反转ioc_深度理解Spring IOC(控制反转)

發布時間:2025/3/12 javascript 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 简述控制反转ioc_深度理解Spring IOC(控制反转) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、IOC概述

Inverse Of Controll即為控制反轉,簡稱IOC

簡單來說,IOC反轉了依賴關系的滿足方式,由之前的自己創建依賴對象,變為由工廠推送。(變主動為被動,即反轉)它解決了具有依賴關系的組件之間的強耦合,使得項目形態更加穩健

二、什么是IOC?

2.1 了解IOC思想

大概了解了IOC是控制反轉,至于現在我們并不清楚它的思想和作用。那么問題來了,IOC(控制反轉)是什么呢?

控制反轉,簡稱IOC。顧名思義,它是由“控制”和“反轉”兩個詞語組合而成。那么我們就順藤摸瓜,分別分析一下這兩個詞語!

2.2 控制

控制一詞,我們需要想的就很多。比如說,達成控制的條件必須是兩個對象 ,控制可以分為誰控制誰控制你做什么 。那我們一一列舉這幾種情況:

  • 在Java中我們以new的方式創建對象,開發者控制控制著開發工具并間接的控制程序創建所需要的依賴對象,對于程序來說是直接的控制創建對象;如果使用IOC呢?那就可以是IOC容器直接的控制創建對象
  • 既然是IOC控制創建對象,那么控制創建對象是怎么控制的呢?使用IOC創建對象是需要標簽引入外部對象,這說明了IOC容器控制著創建依賴對象的入口
  • 2.3 反轉

    反轉一詞,我們想的也很多。比如說,達成反轉的條件必須是兩個對象有反轉就有正轉 ,然后就是反轉了些什么 。那么我們也一一列舉說明:

  • 在Java中我們是間接的實用程序來創建對象,這可以看作正轉。那有了IOC容器,一下子就變了,我們不用自己new對象,而是直接反轉為由IOC創建生成依賴對象并存入IOC容器中
  • 使用IOC容器創建對象我們只需要通過配置來告訴它需要創建的對象是什么,并標識一下以后使用什么來獲取IOC容器中創建好的對象即可(配置使用IOC的過程),這時候等你想要IOC容器中對象就直接用這個唯一標識來獲取就好,而獲取的過程肯定是IOC通過這個唯一標識來查找并返回給我們該對象
  • 也許有的小伙伴還是不明白反轉。為什么要把IOC容器幫我們創建對象的行為叫反轉呢?因為由容器幫我們查找及注入依賴對象,對象只是被動的接受依賴對象。如果不反轉呢?開發者就需要創建對象,并找到、獲取、使用該對象,此過程中的所有都有開發者來控制的
  • 三、IOC的作用

    通過控制反轉,對象在被創建的時候,由一個調控系統內所有對象的外界實體將其所依賴的對象的引用傳遞給它。也可以說,依賴被注入到對象中。

    比如:Class A中用到了Class B的對象b,一般情況下,需要在A的代碼中顯式的new一個B的對象。

    在使用了IOC之后呢?A的代碼只需要定義一個私有的B對象,不需要直接new來獲得這個對象,而是通過相關的容器控制程序來將B對象在外部new出來并注入到A類里的引用中。而具體獲取的方法、對象被獲取時的狀態由配置文件(xml)來指定

    既然由配置文件來指定創建對象關系,就大大降低了各個組件之間的強耦合并有利于維護,是項目變得更加穩健靈活

    四、IOC解決Dao層和Service層的強耦合

    在原始的Web開發中,Dao層和Service層是密不可分的。Dao層為數據訪問層,只與數據庫打交道。Servcie層為業務處理層,只處理實現相應的業務。而我們將Web開發中的Dao層和Service層串在一起,就需要在Service層new一個私有的Dao層實現對象(XxxDaoImpl)。有了IOC的思想,再想想傳統的Dao層與Service層的實現就顯得很不靈活,一旦修改了Dao層實現類,就必須將項目中的源碼都修改掉,顯然是一件非常可怕的事情。

    五、使用IOC解決Dao層和Service層的強耦合

    既然解決Dao層和Service層的強耦合那必須得這兩個組件對吧。

    Dao層

    //?Dao層接口package?com.mylifes1110.dao;import?com.mylifes1110.bean.User;public?interface?UserDao?{????int?insertUser(User?user);}//?Dao層實現類package?com.mylifes1110.dao.impl;import?com.mylifes1110.bean.User;import?com.mylifes1110.dao.UserDao;public?class?UserDaoImpl?implements?UserDao?{????@Override????public?int?insertUser(User?user)?{????????System.out.println("------insertUser?and?UserDao------");????????return?0;????}}

    注意: 我們在使用IOC時,必須將Dao層實現類對象注入到IOC容器中,這必有一個注入方式來告知IOC容器創建對象和獲取對象,在Service層我們并不需要new實現類對象,而是創建一個Service層的Setter方法來注入UserDaoImpl依賴到UserServcieImpl中(這里可以把它們想為拼裝),此時所用的注入方式叫做Setter方法依賴注入,現在不需要糾結,后續我會將依賴注入的所有方式列舉并分析依賴注入思想和依賴注入與IOC的關系。

    Service層

    //?Service層接口package?com.mylifes1110.service;import?com.mylifes1110.bean.User;public?interface?UserService?{????int?insertUser(User?user);}//?Service層實現類package?com.mylifes1110.service.impl;import?com.mylifes1110.bean.User;import?com.mylifes1110.dao.UserDao;import?com.mylifes1110.service.UserService;public?class?UserServiceImpl?implements?UserService?{????private?UserDao?userDao;????public?void?setUserDao(UserDao?userDao)?{????????this.userDao?=?userDao;????}????@Override????public?int?insertUser(User?user)?{????????System.out.println("------insertUser?and?UserService------");????????return?userDao.insertUser(null);????}}

    spring-context.xml

    <?xml ?version="1.0"?encoding="UTF-8"?>????????????????????????????????????

    測試類

    /***?@MethodName?insertUser1*?@Param?[]*?@Description?測試IOC的使用*?@Author?Ziph*?@Date?2020/7/12*/@Testpublic?void?insertUser1()?{????ClassPathXmlApplicationContext?context?=?new?ClassPathXmlApplicationContext("spring-context.xml");????UserService?userService?=?(UserService)?context.getBean("UserService");????userService.insertUser(null);????//?打印結果????------insertUser?and?UserService------????------insertUser?and?UserDao------}

    分享

    上面是本人在學習路上整理的一些比較干貨的java資料,如果有需要的兄弟可以先關注我,私信我回復【資料】即可。

    總結

    以上是生活随笔為你收集整理的简述控制反转ioc_深度理解Spring IOC(控制反转)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。