IOC—控制反轉(依賴注入):一種編程思想

控制:指誰來控制對象的創建 ,傳統的應用程序對象的創建是由程序本身來控制的;使用Spring框架後對象的創建由Spring來控制。

反轉:正常是由程序主動創建對象,而反轉指的是程序被動的接收對象。(主動→被動)

總結:

未使用Spring框架:程序主動創建對象。

使用Spring框架:程序被動接收Spring創建的對象。

IOC的實現是通過IOC容器實現的,IOC容器---BeanFactory。

 

一、使用IOC創建對象的三種方式:

1、通過無參構造函數創建:

調用默認無參構造函數創建。默認情況下,如果類中沒有默認無參構造函數,則創建失敗,會報異常。(常用)

<!-- 使用默認無參構造函數來創建對象-->
<bean id = "studentService" class="service.impl.StudentServiceImpl" scope="prototype"></bean>

2、使用靜態工廠中的方法創建對象:

需要使用bean標籤的factory-method屬性,指定靜態工廠中創建對象的方法。

靜態工廠類如下:

public class StaticFactory {
    public static IStudentService getStudentService(){
        return new StudentServiceImpl();
    }
}

配置使用靜態工廠創建對象:

<!-- 配置使用靜態工廠創建對象-->
<bean id = "staticStudentService" class="factory.StaticFactory" factory-method="getStudentService"></bean>

3、使用實例工廠中的方法創建對象:

需要使用bean標籤的factory-bean和factory-method屬性,指定靜態工廠中創建對象的方法。

實例工廠類如下:

public class InstanceFactory {
    public IStudentService getStudentService(){
        return new StudentServiceImpl();
    }
}

配置使用實例工廠創建對象:

<!-- 配置使用實例工廠創建對象-->
<bean id = "instanceFactory" class="factory.InstanceFactory"></bean>
<bean id = "instanceStudentService" factory-bean="instanceFactory" factory-method="getStudentService"></bean>

二、配置文件

1、Bean的配置:

(1)id是bean的標識符,必須唯一,如果沒有配置id,name默認爲標識符;如果既配置了id又配置了name,那麼name是別名(別名可以有多個,分隔符可以是空格、逗號、分號等)。如果不配置id和name,那麼可以根據applicationContext.getBean(Class)來獲取對象。

(2)class是bean的全限定名,包括包名+類名。

2、團隊合作使用Import來實現:

<!--引用其他文件-->
<import resource="bean.xml"/>

三、依賴注入(dependency injection)

依賴:指bean對象創建依賴於容器。Bean對象的依賴資源。

注入:指bean對象依賴的資源由容器設置和配置。

1、構造函數注入:

(1)涉及的標籤:constructor-arg

(2)標籤的屬性:

         type: 指定參數的類型。

         index:指定參數的索引位置,從0開始

         name:指定參數的名稱(常用)

         value:指定基本數據類型或String類型的數據

         ref:指定其他bean 類型數據

(3)標籤出現的位置:寫在bean標籤內部

<bean id= "studentService" class="service.impl.StudentServiceImpl">
    <constructor-arg name="driver" value="com.mysql.jdbc.Driver"></constructor-arg>
    <constructor-arg name="port" value="3306"></constructor-arg>
    <constructor-arg name="today" ref="now"></constructor-arg>
</bean>
<bean id = "now" class="java.util.Date"></bean>

2、set方法注入:

(1)涉及的標籤:property

(2)標籤的屬性:

          name:指定參數的set方法名稱

          value:指定基本數據類型或string類型的數據

          ref:指定其他bean類型數據

          array:數組類型數據;list:list類型數據;set:set類型數據;Properties:Properties類型數據。

          p命名空間注入:要求有對應屬性的set方法,需要在文件頭加入

xmlns:p="http://www.springframework.org/schema/p"

          c命名空間注入:要求有對應參數的構造方法,需要在文件頭加入

xmlns:c="http://www.springframework.org/schema/c"

(3)標籤出現的位置:寫在bean標籤內部

<bean id= "studentService" class="service.impl.StudentServiceImpl">
    <!--常量注入-->
    <property name="driver" value="com.mysql.jdbc.Driver"></property>
    <!--常量注入-->
    <property name="port" value="3306"></property>
    <!--bean注入-->
    <property name="today" ref="now"></property>
    <!--數組注入-->
    <property name="myStr">
        <array>
            <value>java</value>
            <value>python</value>
        </array>
    </property>
    <!--list注入-->
    <property name="myList">
        <list>
            <value>java</value>
            <value>python</value>
        </list>
    </property>
    <!--map注入-->
    <property name="myMap">
        <map>
            <entry key="中國銀行" value="123456"></entry>
            <entry>
                <key><value>招商銀行</value></key>
                <value>8888888</value>
            </entry>
        </map>
    </property>
    <!--set注入-->
    <property name="mySet">
        <set>
            <value>足球</value>
            <value>籃球</value>
        </set>
    </property>
    <!--Properties注入-->
    <property name="myProps">
        <props>
            <prop key="學號">20200101</prop>
        </props>
    </property>
    <!--null注入-->
    <property name="salary"><null/></property>
</bean>
<!--p命名空間注入-->
<!--<bean id= "studentService" class="service.impl.StudentServiceImpl" p:driver="ppp"/>-->
<!--c命名空間注入-->
<!--<bean id= "studentService" class="service.impl.StudentServiceImpl" c:driver="ppp"/>-->
<bean id = "now" class="java.util.Date"></bean>

四、bean的作用範圍

(1)可以通過配置的方式來調整作用範圍

(2)配置的屬性:bean標籤的scope屬性。

(3)屬性的取值:

1)singleton:單例的(默認)

2)prototype:多例的(當我們讓spring接管struts2的action創建時,action必須配置此值

3)request:作用範圍是一次請求 ,和當前請求的轉發。

4)session:作用範圍是一次會話。

5)globalsession:作用範圍時一次全局會話。

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