Spring學習 反轉控制 與 依賴注⼊

1、 反轉(轉移)控制(IOC Inverse of Control)

1、控制:對於成員變量賦值的控制權
2、反轉控制:把對於成員變量賦值的控制權,從代碼中反轉(轉移)到Spring⼯⼚和配置⽂件中完成
3、 好處:解耦合
4、底層實現:⼯⼚設計模式
在這裏插入圖片描述

2、 依賴注⼊ (Dependency Injection DI)

1、注⼊:通過Spring的⼯⼚及配置⽂件,爲對象(bean,組件)的成員變量賦值
2、依賴注⼊:當⼀個類需要另⼀個類時,就意味着依賴,⼀旦出現依賴,就可以把另⼀個類作爲本類的成員變量,最終通過Spring配置⽂件進⾏注⼊(賦值)。
3、 好處:解耦合
在這裏插入圖片描述

3、Spring⼯⼚創建複雜對象

在這裏插入圖片描述

1、 什麼是複雜對象

複雜對象:指的就是不能直接通過new構造⽅法創建的對象
比如: Connection、 SqlSessionFactory

2、Spring⼯⼚創建複雜對象的3種⽅式

2.1 FactoryBean接⼝

開發步驟
實現FactoryBean接⼝
在這裏插入圖片描述Spring配置⽂件的配置

# 如果Class中指定的類型 是FactoryBean接⼝的實現類,那麼通過id值獲得的是這個類所創建的複雜對象Connection
<bean id="conn" class="com.baizhiedu.factorybean.ConnectionFactoryBean"/>

細節
如果就想獲得FactoryBean類型的對象ctx.getBean("&conn") 獲得就是ConnectionFactoryBean對象

isSingleton⽅法 返回 true 只會創建⼀個複雜對象
返回 false 每⼀次都會創建新的對象 
問題:根據這個對象的特點 ,決定是返回true(SqlSessionFactory) 還是 false (Connection)


mysql⾼版本連接創建時,需要制定SSL證書,

解決問題的⽅式
url ="jdbc:mysql://localhost:3306/suns?useSSL=false"


依賴注⼊的體會(DI)

把ConnectionFactoryBean中依賴的4個字符串信息 ,進⾏配置⽂件的注⼊
好處:解耦合
<bean id="conn" class="com.baizhiedu.factorybean.ConnectionFactoryBean">
 <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
 <property name="url" value="jdbc:mysql://localhost:3306/suns?useSSL=false"/>
 <property name="username" value="root"/>
 <property name="password" value="123456"/>
</bean>

FactoryBean的實現原理[簡易版]

接⼝回調
1. 爲什麼Spring規定FactoryBean接⼝實現 並且 getObject()?
2. ctx.getBean("conn") 獲得是複雜對象 Connection ⽽沒有 獲得ConnectionFactoryBean(&)

Spring內部運⾏流程
1. 通過conn獲得ConnectionFactoryBean類的對象 ,進⽽通過instanceof 判斷出是FactoryBean接⼝的實現類
2. Spring按照規定 getObject() --->Connection
3. 返回Connection

在這裏插入圖片描述

FactoryBean總結

Spring中⽤於創建複雜對象的⼀種⽅式,也是Spring原⽣提供的,後續講解Spring整
合其他框架,⼤量應⽤FactoryBean

2.2 實例⼯⼚

  1. 避免Spring框架的侵⼊
  2. 整合遺留系統

開發步驟

<bean id="connFactory"  class="com.baizhiedu.factorybean.ConnectionFactory"></bean>
<bean id="conn" factorybean="connFactory" factorymethod="getConnection"/>

2.3 靜態⼯⼚

開發步驟

<bean id="conn" class="com.baizhiedu.factorybean.StaticConnectionFactory" factorymethod="getConnection"/>

在這裏插入圖片描述

4、控制Spring⼯⼚創建對象的次數

1、如何控制簡單對象的創建次數

<bean id="account" scope="singleton|prototype"  class="xxxx.Account"/>
sigleton:只會創建⼀次簡單對象 默認值
prototype:每⼀次都會創建新的對象

2、如何控制複雜對象的創建次數

FactoryBean{
    isSingleton(){
       return true 只會創建⼀次
      return false 每⼀次都會創建新的
 }
}

如沒有isSingleton⽅法 還是通過scope屬
性 進⾏對象創建次數的控制

3、爲什麼要控制對象的創建次數?

好處:節省不別要的內存浪費

什麼樣的對象只創建⼀次?

  1. SqlSessionFactory
  2. DAO
  3. Service

什麼樣的對象 每⼀次都要創建新的?

  1. Connection
  2. SqlSession | Session
  3. Struts2 Action
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章