最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring IOC與DI核心深入理解

 更新時(shí)間:2023年02月20日 09:12:13   作者:綠仔牛奶_  
IOC也是Spring的核心之一了,之前學(xué)的時(shí)候是采用xml配置文件的方式去實(shí)現(xiàn)的,后來其中也多少穿插了幾個(gè)注解,但是沒有說完全采用注解實(shí)現(xiàn)。那么這篇文章就和大家分享一下,全部采用注解來實(shí)現(xiàn)IOC+DI

深入理解IOC思想

spring本質(zhì)就在于將對象全部交由給spring容器創(chuàng)建和管理,由容器控制對象的整個(gè)生命周期、核心就是IOC控制反轉(zhuǎn)和AOP面向切面編程

先說IOC

IOC是一種設(shè)計(jì)思想,叫做控制反轉(zhuǎn)。本質(zhì)就是通過Spring來負(fù)責(zé)對象的生命周期以及對象間的關(guān)系。在面向?qū)ο蟮拈_發(fā)過程中,我們程序中的各個(gè)對象往往會(huì)存在各種各樣的依賴關(guān)系,因此耦合度極高,一旦修改其中一個(gè)類信息就會(huì)牽扯到很多相關(guān)類需要修改。那么為了降低這種耦合度IOC指出引用第三方容器,也就是將所有對象的創(chuàng)建和管理交由第三方容器統(tǒng)一操作。這里的容器指的就是spring容器,我們需要將各個(gè)實(shí)現(xiàn)類映射到spring容器中的bean。

看了網(wǎng)上一些大佬的理解,針對IOC主要兩個(gè)問題,IOC是誰控制誰,被反轉(zhuǎn)的是什么?Spring容器控制了對象,創(chuàng)建對象的主動(dòng)權(quán)從程序編碼反轉(zhuǎn)給了spring容器。扯到IOC就不得不提DI依賴注入,

  • 應(yīng)用程序依賴于IOC容器
  • 通過DI,程序可以獲得所需的依賴資源比如一個(gè)對象或常量數(shù)據(jù)
  • IOC容器將依賴對象注入到程序中

這個(gè)過程就體現(xiàn)出了IOC思想。

面試回答:什么是IOC?傳統(tǒng)的面向?qū)ο箝_發(fā)中需要我們手動(dòng)編碼通過new關(guān)鍵字創(chuàng)建對象并為對象裝配所需資源,而控制反轉(zhuǎn)則可以將創(chuàng)建對象的主動(dòng)權(quán)交給第三方容器完成,程序變成被動(dòng)的接收對象。我認(rèn)為IOC主要牽扯到兩個(gè)問題就是誰控制誰,什么被反轉(zhuǎn)?首先控制就是由最初的程序控制對象反轉(zhuǎn)為由容器控制對象,被反轉(zhuǎn)的就是獲取依賴對象的方式

DI&IOC

一直覺得對于IOC的理解不夠深入,發(fā)現(xiàn)自己忽略了一個(gè)關(guān)鍵詞–>依賴對象,那么什么是依賴對象。對于依賴對象的定義我的理解是,兩個(gè)對象都有自己需要完成的工作,但是A對象的一些行為需要B對象協(xié)作完成,那么在這些協(xié)作完成的行為中A對象就可以被稱之為B對象的依賴對象。此時(shí)兩者的耦合度是較高的,因?yàn)橐坏┠骋粋€(gè)對象發(fā)生變化將會(huì)影響到另一個(gè)對象

我們假設(shè)對象A需要去操作數(shù)據(jù)庫,那么A就會(huì)需要獲得Connection連接對象,在使用spring之前我們通過編碼new關(guān)鍵字獲取一個(gè)連接交給對象A,此時(shí)對象A與Connection就是存在一定的耦合性的。引入了spring容器之后,我們將Connection去注冊到容器當(dāng)中然后Connection會(huì)由容器創(chuàng)建完成,當(dāng)A需要的時(shí)候就丟給A去使用,不用去關(guān)心Connection怎么創(chuàng)建,實(shí)現(xiàn)解耦。Connection就是對象A的一個(gè)依賴對象,但是在我看來,依賴對象并不僅僅代表一個(gè)對象,也可以是一個(gè)常量數(shù)據(jù)。我在整合mybatis和spring的時(shí)候,我終于體會(huì)到了解耦的感覺,之前在使用sqlSessionFactory創(chuàng)建SqlSession的過程中,首先要?jiǎng)?chuàng)建sqlSessionFactory然后通過它的openSession方法去獲取SqlSession實(shí)例,也就是說SqlSession依賴于SqlSessionFactory,下面看最初的寫法

{
  private static SqlSessionFactory sqlSessionFactory;
  static {
    try {
      InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
      sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    } catch (IOException e) {
      throw new RuntimeException(e);
    }
  }
  // 提供工廠方法 創(chuàng)建sqlSession實(shí)例
  public static SqlSession getSqlSession(){
    return sqlSessionFactory.openSession();
  }
}

上述代碼中,我們通過new創(chuàng)建SqlSessionFactoryBuilder,在調(diào)用它的build方法創(chuàng)建出了sqlSessionFactory,這之間就存在這依賴關(guān)系,也就是存在耦合。繼續(xù)往下看,我們直接編寫好一個(gè)方法用于獲取SqlSession實(shí)例,但是這個(gè)方法也是通過factory創(chuàng)建的。所以兩者之間同樣存在耦合關(guān)系。那么引入spring容器之后,我們利用第三方的容器,就可以實(shí)現(xiàn)兩者的解耦??聪铝衋pplicationContext的配置

<!--  配置sqlSessionFactory  -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  <property name="dataSource" ref="datasource"/>
  <!--   綁定mybatis配置文件     -->
  <property name="configLocation" value="classpath:mybatis-config.xml"/>
  <!--     映射器  注冊mapper.xml文件   -->
  <property name="mapperLocations" value="classpath:com/yuqu/dao/*.xml"/>
</bean>
<!--  配置sqlsession  -->
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
  <!--      只能選擇構(gòu)造器注入sqlSessionFactory  沒有SqlSessionTemplate提供set方法  -->
  <constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>

看到了嗎,sqlSessionFactory被我們映射為容器中的bean,然后映射SqlSession的bean,然后通過注入的方式將sqlSessionFactory注入進(jìn)sqlSession中,當(dāng)在程序中需要獲取sqlSession的時(shí)候就不用再去管SqlSessionFactory是如何創(chuàng)建的。以此實(shí)現(xiàn)真正解耦的目的。同樣的我們可以將sqlSession去配置到其他的bean中

<bean id="userMapperImpl" class="com.yuqu.dao.UserMapperImpl">
  <property name="sqlSession" ref="sqlSession"/>
</bean>

這樣在需要獲取userMapperImpl對象的時(shí)候就不用再去創(chuàng)建sqlSession實(shí)例然后getMapper,只需要直接用spring去getBean即可獲取到,同樣也完成了解耦工作。

所以說,DI依賴注入就是實(shí)現(xiàn)IOC的一種方式。

關(guān)于AOP面向切面編程,可以參考這篇博客

到此這篇關(guān)于Spring IOC與DI核心深入理解的文章就介紹到這了,更多相關(guān)Spring IOC與DI內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java使用ant.jar解壓縮文件的示例代碼

    java使用ant.jar解壓縮文件的示例代碼

    這篇文章主要介紹了java使用ant.jar解壓縮文件,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-09-09
  • java LRU(Least Recently Used )詳解及實(shí)例代碼

    java LRU(Least Recently Used )詳解及實(shí)例代碼

    這篇文章主要介紹了java LRU(Least Recently Used )詳解及實(shí)例代碼的相關(guān)資料,Java里面實(shí)現(xiàn)LRU緩存通常有兩種選擇,一種是使用LinkedHashMap,一種是自己設(shè)計(jì)數(shù)據(jù)結(jié)構(gòu),使用鏈表+HashMap,需要的朋友可以參考下
    2016-11-11
  • java WebSocket客戶端斷線重連的實(shí)現(xiàn)方法

    java WebSocket客戶端斷線重連的實(shí)現(xiàn)方法

    在工作中是否會(huì)遇到實(shí)用websocket客戶端連接服務(wù)端的時(shí)候,網(wǎng)絡(luò)波動(dòng),服務(wù)端斷連的情況,本文可以直接使用的斷線重連,感興趣的可以了解一下
    2021-10-10
  • 解決Java包裝類比較時(shí)遇到的問題

    解決Java包裝類比較時(shí)遇到的問題

    所謂包裝類的作用就是將原始數(shù)據(jù)類型轉(zhuǎn)換成引用數(shù)據(jù)類型,下面這篇文章主要給大家介紹了關(guān)于在Java包裝類比較時(shí)遇到的問題的解決方法,文中給出了詳細(xì)的示例代碼,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-09-09
  • 詳解Spring Boot2 Webflux的全局異常處理

    詳解Spring Boot2 Webflux的全局異常處理

    這篇文章主要介紹了詳解Spring Boot2 Webflux的全局異常處理,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-12-12
  • collection集合體系與并發(fā)修改異常的解決方法

    collection集合體系與并發(fā)修改異常的解決方法

    今天小編就為大家分享一篇關(guān)于collection集合體系與并發(fā)修改異常的解決方法,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • 為什么說HashMap線程不安全

    為什么說HashMap線程不安全

    本文主要介紹了為什么說HashMap線程不安全,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • Spring boot多線程配置方法

    Spring boot多線程配置方法

    這篇文章主要為大家詳細(xì)介紹了Spring boot多線程配置方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • springboot?security驗(yàn)證碼的登錄實(shí)例

    springboot?security驗(yàn)證碼的登錄實(shí)例

    這篇文章主要介紹了springboot?security驗(yàn)證碼的登錄實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • Java集合之Map接口的實(shí)現(xiàn)類精解

    Java集合之Map接口的實(shí)現(xiàn)類精解

    Map提供了一種映射關(guān)系,其中的元素是以鍵值對(key-value)的形式存儲(chǔ)的,能夠?qū)崿F(xiàn)根據(jù)key快速查找value;Map中的鍵值對以Entry類型的對象實(shí)例形式存在;鍵(key值)不可重復(fù),value值可以重復(fù),一個(gè)value值可以和很多key值形成對應(yīng)關(guān)系,每個(gè)建最多只能映射到一個(gè)值
    2021-09-09

最新評(píng)論

灵宝市| 台湾省| 防城港市| 彭泽县| 平南县| 永济市| 文山县| 西城区| 阿拉善盟| 临高县| 弋阳县| 平塘县| 延庆县| 皮山县| 韶关市| 舞钢市| 遂昌县| 丰原市| 长沙市| 固安县| 克拉玛依市| 乐安县| 大余县| 常德市| 大同市| 田林县| 马公市| 谷城县| 台北市| 安陆市| 丹凤县| 武城县| 富宁县| 彭水| 安龙县| 冷水江市| 延吉市| 陕西省| 孙吴县| 永兴县| 都兰县|