IoC就是Inversion of Control,控制反轉也叫依賴注入(Dependency Injection)。
1.IOC 概念定義: 類之間的依賴關係,不再由類自己去負責,而是由容器根據配置文件去創建實例並維護各個實例之間的依賴關係。在Java開發中,IoC意味着將你設計好的類交給系統去控制,而不是在你的類內部控制。這稱爲控制反轉。
2.優點:
(1):避免了代碼的糾纏,(業務邏輯和業務邏輯無關的代碼糾纏到一塊)代碼更容易被維護
(2):模塊的耦合性降低
(3):易測試
二:Spring中實現IOC的方式:
1:Spring中依賴注入的兩種方式:
(1):通過 setter 方法注入:
<property name=“ ” ></property>
其中,name屬性的取值依setter方法名而定,要求這個類裏面這個對應的屬性必須有setter方法
(2):通過構造方法注入:
<constructor-arg index=””></ constructor-arg>
其中,index表示構造方法中的參數索引(第一個參數索引爲0)
要求這個類裏面必須有想對應的構造方法
(3):實現接口
注:使用註解---是面向接口的,但是不能說成是Spring的IOC實現的方式,Spring的IOC實現依賴注入的方式只有上面的三種。
constructor : 可以在構建對象的同時,把依賴關係也構建好。對象創建好就準備好的所有的資源。安全性高。
setter : 建立的對象關係(參數)很多。創建完對象之後再同過set()方法進行設定。
Spring 鼓勵使用setter的方式注入。
接口因爲歷史悠久,在很多容器中都已經得到了應用,但由於其在靈活性,易用性上不如其他兩種方式,索引在IOC使用上並不被看好。
三:容器對bean屬性的裝配
1. 基本類型和字符串類型屬性的裝配(value):
<property name="owner">
<value>張三</value>
</property>
2. 引用類型屬性的裝配
<ref bean="otherBean" />
</property>
(1)ref: local 只在當前配置文件中找
(2)ref:bean 在所有的配置文件中
(3)直接把另外一個bean的定義,定義在一個bean裏面。
相當於定義了個內部類,但是客戶端就不可見內部定義的bean
3. 集合類型屬性的裝配
(1)list:可以混合存放各種類型,支持泛型,存放的數據是有序的,可以有重複,
(2)set:可以混合存放各種類型,支持泛型,存放的數據是無序的,不可以重複
(3)map:支持泛型,存放鍵值對。
(4)props:本質上也是一個map,但是鍵值都是字符串類型的。
例子:
<property name="listProperty">
<list>
<value>zhangsan</value>
<value>zhangsan</value>
<value>zhangsan</value>
</list>
</property>
<property name="setProperty">
<set>
<value>str</value>
<value>str</value>
<value>str1</value>
</set>
</property>
<property name="mapProperty">
<map>
<entry key="key1">
<value>value1</value>
</entry>
<entry key="key2">
<value>value2</value>
</entry>
</map>
</property>
<property name="proProperty">
<props>
<prop key="key1">value1</prop>
<prop key="key2">value2</prop>
<prop key="key3">value3</prop>
</props>
</property>
四:bean 的其他屬性介紹
1. 自動裝配 (bean標籤的autowire屬性):
作用:不明確配置,自動將某個bean 注入到另一個bean的屬性當中
分類:
(1)byname:通過id 的名字來進行匹配,
(2)byType:通過類型來進行匹配
(3)constructor:根據java 源程序中定義的構造方法,再根據類型進行匹配。
(4)autodetect:完全交給spring管理, spring 則再根據constructor à byType的順序進行匹配。
注:
自動裝配的優先級低於手動裝配
自動裝配一般應用於快速開發中,但是不推薦使用,代碼簡單,但是一方面容易出錯,另一方面也不方便後期的維護
五:bean實例的生命週期及範圍
1. Bean的生命週期:
(1)實例化(必須的)構造函數構造對象
(2)裝配(可選的)爲屬性賦值
(3)回調(可選的)(容器-控制類和組件-回調類)
(4)初始化(init-method=" ")
(5)就緒
(6)銷燬(destroy-method=" ")
2. bean的範圍
Bean:默認情況下,容器是按照單例的方式去創建的bean,如果不想使用那麼用(scope=" ")定義bean的使用範圍
Bean的範圍有(經常使用的是前兩種):
(1)Singleton:默認的
(2)Prototype:每次取出的都是新的對象
(3)Request:bean的生命週期和一個http請求一直
(4)session:在一個會話週期中有效
六:IOC中其他接口的使用
1. Beanpostprocessor:(後處理bean)在對象實例化後,進行方法調用前進行特殊處理
2. BeanFactoryPostProcessor:在實例化對象前,對配置文件進行特殊處理
3. PropertyeditorSupport :屬性編輯器類
可以根據定義的規則,將字符串類型自動編輯成一個對象類型來進行屬性注入。
4. PropertyPlaceholderConfigurer:
方便分散配置的一個類,可以讀取配置文件,以${key}獲得對應的value值
5. CustomEditorConfigurer:配置用戶自定義的屬性編輯器
例:
<bean
class="org.springframework.beans.factory.config
.PropertyPlaceholderConfigurer">
<property name="location">
<value>ioc\\info.properties</value>
</property>
</bean>
<bean id="customEditorConfigurer"
class="org.springframework.beans.factory.config
.CustomEditorConfigurer">
<property name="customEditors">
<map>
<entry key="ioc9.Address">
<bean id="myEditor"class="ioc9.AddressEditor">
</bean>
</entry>
</map>
</property>
</bean>
七:Spring的事件處理機制:(監聽機制)
1. 自定義一個事件,需要實現接口ApplicationEvent
2. 定義一個監聽器,需要實現接口ApplicationListener
3. bean調用容器的方法,發佈事件,需要實接口ApplicationContextAware,來獲得對容器的引用