91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring?IOC與DI核心概念是什么

發布時間:2023-02-25 13:51:33 來源:億速云 閱讀:104 作者:iii 欄目:開發技術

這篇文章主要介紹“Spring IOC與DI核心概念是什么”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“Spring IOC與DI核心概念是什么”文章能幫助大家解決問題。

深入理解IOC思想

spring本質就在于將對象全部交由給spring容器創建和管理,由容器控制對象的整個生命周期、核心就是IOC控制反轉和AOP面向切面編程

先說IOC

IOC是一種設計思想,叫做控制反轉。本質就是通過Spring來負責對象的生命周期以及對象間的關系。在面向對象的開發過程中,我們程序中的各個對象往往會存在各種各樣的依賴關系,因此耦合度極高,一旦修改其中一個類信息就會牽扯到很多相關類需要修改。那么為了降低這種耦合度IOC指出引用第三方容器,也就是將所有對象的創建和管理交由第三方容器統一操作。這里的容器指的就是spring容器,我們需要將各個實現類映射到spring容器中的bean。

看了網上一些大佬的理解,針對IOC主要兩個問題,IOC是誰控制誰,被反轉的是什么?Spring容器控制了對象,創建對象的主動權從程序編碼反轉給了spring容器。扯到IOC就不得不提DI依賴注入,

  • 應用程序依賴于IOC容器

  • 通過DI,程序可以獲得所需的依賴資源比如一個對象或常量數據

  • IOC容器將依賴對象注入到程序中

這個過程就體現出了IOC思想。

面試回答:什么是IOC?傳統的面向對象開發中需要我們手動編碼通過new關鍵字創建對象并為對象裝配所需資源,而控制反轉則可以將創建對象的主動權交給第三方容器完成,程序變成被動的接收對象。我認為IOC主要牽扯到兩個問題就是誰控制誰,什么被反轉?首先控制就是由最初的程序控制對象反轉為由容器控制對象,被反轉的就是獲取依賴對象的方式

DI&IOC

一直覺得對于IOC的理解不夠深入,發現自己忽略了一個關鍵詞–>依賴對象,那么什么是依賴對象。對于依賴對象的定義我的理解是,兩個對象都有自己需要完成的工作,但是A對象的一些行為需要B對象協作完成,那么在這些協作完成的行為中A對象就可以被稱之為B對象的依賴對象。此時兩者的耦合度是較高的,因為一旦某一個對象發生變化將會影響到另一個對象

我們假設對象A需要去操作數據庫,那么A就會需要獲得Connection連接對象,在使用spring之前我們通過編碼new關鍵字獲取一個連接交給對象A,此時對象A與Connection就是存在一定的耦合性的。引入了spring容器之后,我們將Connection去注冊到容器當中然后Connection會由容器創建完成,當A需要的時候就丟給A去使用,不用去關心Connection怎么創建,實現解耦。Connection就是對象A的一個依賴對象,但是在我看來,依賴對象并不僅僅代表一個對象,也可以是一個常量數據。我在整合mybatis和spring的時候,我終于體會到了解耦的感覺,之前在使用sqlSessionFactory創建SqlSession的過程中,首先要創建sqlSessionFactory然后通過它的openSession方法去獲取SqlSession實例,也就是說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);
    }
  }
  // 提供工廠方法 創建sqlSession實例
  public static SqlSession getSqlSession(){
    return sqlSessionFactory.openSession();
  }
}

上述代碼中,我們通過new創建SqlSessionFactoryBuilder,在調用它的build方法創建出了sqlSessionFactory,這之間就存在這依賴關系,也就是存在耦合。繼續往下看,我們直接編寫好一個方法用于獲取SqlSession實例,但是這個方法也是通過factory創建的。所以兩者之間同樣存在耦合關系。那么引入spring容器之后,我們利用第三方的容器,就可以實現兩者的解耦。看下列applicationContext的配置

<!--  配置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">
  <!--      只能選擇構造器注入sqlSessionFactory  沒有SqlSessionTemplate提供set方法  -->
  <constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>

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

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

這樣在需要獲取userMapperImpl對象的時候就不用再去創建sqlSession實例然后getMapper,只需要直接用spring去getBean即可獲取到,同樣也完成了解耦工作。所以說,DI依賴注入就是實現IOC的一種方式。

關于“Spring IOC與DI核心概念是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

广饶县| 册亨县| 勐海县| 枝江市| 手游| 珲春市| 拉萨市| 伊川县| 武宁县| 出国| 银川市| 乌鲁木齐市| 彭山县| 巨野县| 满洲里市| 宁夏| 澄江县| 濮阳市| 千阳县| 嫩江县| 华容县| 永德县| 黄龙县| 藁城市| 灵石县| 张家港市| 古丈县| 天等县| 阆中市| 和静县| 府谷县| 昭觉县| 抚州市| 霍邱县| 苏尼特左旗| 辰溪县| 宁德市| 三河市| 秦安县| 兰溪市| 潼关县|