二、控制反轉(inverse of control IOC )

1.       Bean 工廠(BeanFactory)的功能和配置

I、  ClassPathResource

l  在類路徑下查找資源

l  另有 FileSystemResource

II、             XmlBeanFactory

l  讀取 xml 文件中的配置信息

l  生產bean

l  解決bean 依賴

2.       Bean 的創建

spring可調用bean的構造方法,或通過工廠方法生產 bean對象

I、  利用 bean 的構造方法創建bean

l  無參的構造方法(通過set方法設置,一定要有set方法)

<bean id="refName" class="com.xasxt.UserDao">

<property name="username" value="root"/>

<property name="password" value="123"/>

</bean>

l  有參的構造方法,需指明構造方法的參數列表,通過:

<bean id="refName" class=" com.xasxt.UserDao ">

<construct-arg><value>root</value></construct-arg>

<construct-arg><value>123</value></construct-arg>

</bean>

表明調用了有兩個參數的構造方法

II、             通過工廠方法獲得 bean對象

bean 沒有公共的構造方法,需通過工廠類或工廠實例來創建

分爲靜態工廠和實例工廠方法兩種情況

l  靜態工廠方法:

class 指明工廠類,factory-method 指明工廠方法如:

 Connection con=DriverManager.getConnection(url,user,pwd);

對應的配置:

<beanid="con" class="java.sql.DriverManager" factory-method="getConnection">             <construct-arg><value>jdbc:mysql://localhost/test</value></construct-arg>

<construct-arg><value>zhangsan</value></construct-arg>

<construct-arg><value>pwd</value></construct-arg>

</bean>

                工廠方法參數和構造方法參數設置的形式相同

 

l  實例工廠方法:

要先創建工廠實例,然後再由工廠實例創建產品

如: Statement stmt = con.createStatement();

con 對象是工廠

stmt 對象是產品

配置爲:

<bean id="con" class="java.sql.DriverManager" factory-method="getConnection">

……

</bean>

<bean id="stmt" factory-bean="con" factory-method="createStatement"/>

3.       Bean的作用域

Bean作用域(scope屬性)

作用域

描述

singleton

在每個Spring IoC容器中一個bean定義對應一個對象實例。

prototype

一個bean定義對應多個對象實例。

request

在一次HTTP請求中,一個bean定義對應一個實例;即每次HTTP請求將會有各自的bean實例,它們依據某個bean定義創建而成。該作用域僅在基於web的Spring ApplicationContext情形下有效。

session

在一個HTTP Session中,一個bean定義對應一個實例。該作用域僅在基於web的Spring ApplicationContext情形下有效。

global session

在一個全局的HTTP Session中,一個bean定義對應一個實例。典型情況下,僅在使用portlet context的時候有效。該作用域僅在基於web的Spring ApplicationContext情形下有效。

bean工廠生產bean 缺省都是單例的(singleton)

後兩者用於web應用中

4.       通過注入解決bean的依賴

I、  依賴注入的兩種方式

l  set 注入

spring 直接利用了beanset或構造方法

避免了使用接口注入的侵入性

<bean id="person" class="com.xasxt.spring.Person">

        <!-- set方法設置注入 -->

        <property name="id" value="001"/>

        <property name="name" value="zhangsan"/>

        <property name="sex" value="M"/>

        <property name="mari" value="false"/>

        <property name="salary" value="4500"/>

</bean>

l  構造方法注入

<bean id="person" class="com.xasxt.spring.Person">

       <!-- 構造方法的方式注入 -->

        <constructor-arg>

           <value>002</value>

        </constructor-arg>

        <constructor-arg>

           <value>lisi</value>

        </constructor-arg

        <constructor-arg>

           <value>false</value>

        </constructor-arg>

        <constructor-arg>

           <value>M</value>

        </constructor-arg>

        <constructor-arg>

           <value>5000</value>

        </constructor-arg>

</bean>

II、             依賴的目標類型分成三種形式:

l  基本類型+String 

<value>data</value>

類型自動轉化

l  對其他bean的引用 

<bean id="prop" abstract="true"><!—只作爲模板,不能被實例化-->

       <property name="address" value="beijing"></property>

</bean>

<!—上面是公共屬性注入,下面可以引用-->

<bean id="stu" class="com.xasxt.dependency.Student" parent="prop"><!—可以引用公共屬性-->

       <property name="name" value="zhangsan"></property>

       <property name="code" value="01101"></property>

    </bean>

    <bean id="tea" class="com.xasxt.dependency.Teacher" parent="prop"><!—可以引用公共屬性-->

       <property name="name" value="Li Sir"></property>

       <property name="job" value="java teacher"></property>

    </bean>

    <!-- 普通裝配 -->

    <bean id="c" class="com.xasxt.dependency.Class">

       <property name="name" value="class One"></property>

       <property name="teacher" ref="tea"></property>

       <property name="stus">

           <list>

              <ref bean="stu"/>

           </list>

       </property>

    </bean>

l  集合類型

Set

             

<property name="sets">

    <set>

       <value>wangso</value>

       <value>haoren</value>

       <value>ganka</value>

    </set>

</property>

ArrayList同樣設置

List

             

Map

             

<property name="map">

    <map>

       <entry key="aaa">

           <value>7688</value>

       </entry>

       <entry key="bbb">

           <value>9788</value>

       </entry>

       <entry key="ccc">

           <value>8769</value>

       </entry>

    </map>

</property>

III、          讓spring 自動裝配bean,解決依賴

autowire屬性指明自動裝配的依據:

byName--- id的值=bean中的property名

byType--- 屬性的類型=當前工廠中bean的類型       

constructor--構造方法參數的類型=當前工廠中bean的類型

autodetect-- constructor ---> byType

autowire-candidate屬性

指明是否作爲 autowire 的候選對象(true或false)

解決多個候選對象的衝突

IV、           讓容器檢測 bean 所有的依賴是否都已經滿足

防止bean的遺漏裝配,在運行後出現莫名奇妙的情況,可以設置下列屬性

dependency-check屬性指明應檢查的目標類型

simple -- 基本類型+字符串+集合

objects --- 對其他bean的依賴

all---對各類型都檢查

none -- 默認值

V、              通過classpath自動掃描方式把組件納入spring容器中管理

1、需要在文件中加入下面一句配置:

<context:component-scan base-package="com.xasxt.spring"/>

黃色是包名

2、還需要在各個類中加入下列註解之一:

@Service       @Controller        @Repository       @Component

約定優於配置
發佈了32 篇原創文章 · 獲贊 2 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章