1. 程式人生 > >Spring的IOC容器學習筆記

Spring的IOC容器學習筆記

(一)Spring的IOC學習

  在applicationContext.xml來配置bean,通過該介面,在主程式中,可以指定初始化的物件,不需要在進行賦值操作,直接在xml裡配置好。

接下來分享的是bean配置的多種方法:

①通過類的id獲取bean

<bean id="user" class="com.author.bean.user">
        <property name="name" value="Spring"></property>
        <property name="age" value="18"></property>
        <property name="sex" value="男"></property>
</bean>

在主函式中,通過容器裡的id來獲取bean物件

ApplicationContext aContext=new ClassPathXmlApplicationContext("applicationContext.xml");
user beanUser=(user)aContext.getBean("user");
beanUser.print();

輸出該物件的資訊:

 

 

 ②通過型別獲取bean,缺點是隻能是一個該型別的bean物件,如果有多個則會出錯,多個可以通過id的方式來進行獲取

例如上面的user物件,在主函式中可以這樣獲取:

ApplicationContext aContext=new ClassPathXmlApplicationContext("applicationContext.xml");
user beanUser=aContext.getBean(user.class);
beanUser.print();

得到的結果和上面的一樣

二、給bean的屬性賦值多種操作

①直接通過<property name="name" value="Spring"></property>利用name,value的方式進行賦值

②通過構造器進行賦值,前提在bean類中有該建構函式

<bean id="user03" class="com.author.bean.user">
        <constructor-arg name="name" value="小明"></constructor-arg>
       <constructor-arg name="age" value="18"></constructor-arg>
       <constructor-arg name="sex" value="男"></constructor-arg>
</bean>

還可以直接省略name屬性:

<!-- 省略name屬性 -->
    <bean id="user04" class="com.author.bean.user">
        <constructor-arg value="校花"></constructor-arg>
        <constructor-arg value="10"></constructor-arg>
        <constructor-arg value="女"></constructor-arg>
    </bean>

通過索引值指定引數位置

<bean id="book" class="com.atguigu.spring.bean.Book" >
           <constructor-arg value= "10010" index ="0"/>
           <constructor-arg value= "Book01" index ="1"/>
           <constructor-arg value= "Author01" index ="2"/>
           <constructor-arg value= "20.2" index ="3"/>
     </bean >

通過型別不同區分過載的構造器

<bean id="book" class="com.atguigu.spring.bean.Book" >
      <constructor-arg value= "10010" index ="0" type="java.lang.Integer" />
      <constructor-arg value= "Book01" index ="1" type="java.lang.String" />
      <constructor-arg value= "Author01" index ="2" type="java.lang.String" />
      <constructor-arg value= "20.2" index ="3" type="java.lang.Double" />
</bean >

p名稱空間:為了簡化XML檔案的配置,越來越多的XML檔案採用屬性而非子元素配置資訊。

需要匯入:xmlns:p="http://www.springframework.org/schema/p"

<bean 
    id="studentSuper" 
    class="com.atguigu.helloworld.bean.Student"
    p:studentId="2002" p:stuName="Jerry2016" p:age="18" />

三、內部bean物件以及引用物件

通過<null/>指定空元素

引用物件的使用:ref=“引用外部物件的id”

<bean id="car01" class="com.author.bean.car">
        <constructor-arg value="寶馬" ></constructor-arg>
         <constructor-arg value="藍白色"></constructor-arg>
          <constructor-arg value="30000"></constructor-arg>
    </bean>
    
    <bean id="user05" class="com.author.bean.user">
        <property name="name">
            <null></null>
        </property>
        <!-- ref引用的是外部的bean -->
        <property name="car" ref="car01"></property> 
    </bean>

內部bean物件:相當於car=new car(),car物件在user物件裡

<bean id="car01" class="com.author.bean.car">
        <constructor-arg value="寶馬" ></constructor-arg>
         <constructor-arg value="藍白色"></constructor-arg>
          <constructor-arg value="30000"></constructor-arg>
    </bean>
    
    <bean id="user05" class="com.author.bean.user">
        <property name="name">
            <null></null>
        </property>
        <!-- 相當於car=new car() 引用內部bean -->
        <property name="car">
            <bean class="com.author.bean.car">
                <property name="name" value="自行車"></property>
            </bean>
        </property>
    </bean>

四、集合屬性

①List和map

List集合裡包括:一個自定義的物件,一個引用物件。

  配置java.util.List型別的屬性,需要指定<list>標籤,在標籤裡包含一些元素。

  這些標籤可以通過<value>指定簡單的常量值,通過<ref>指定對其他Bean的引用。

  通過<bean>指定內建bean定義。通過<null/>指定空元素。

Map集合裡包括:2個value,一個引用,一個自定義物件,都對應著不同的key值

  <map>標籤裡可以使用多個<entry>作為子標籤。每個條目包含一個鍵和一個值。

 

  必須在<key>標籤裡定義鍵。

 

  因為鍵和值的型別沒有限制,所以可以自由地為它們指定<value>、<ref>、<bean>或<null/>元素。

 

  可以將Map的鍵和值作為<entry>的屬性定義:簡單常量使用key和value來定義;bean引用通過key-ref和value-ref屬性定義。

 

<bean id="refbook" class="com.author.bean.Book">
        <property name="name" value="西廂記"></property>
    </bean>
    
    
    <bean id="user06" class="com.author.bean.user">
        <property name="books">
            <list>
                <!-- list標籤體中新增每一個元素 -->
                <bean  class="com.author.bean.Book">
                    <property name="name" value="西遊記"></property>
                    <property name="author" value="吳承恩"></property>
                    <property name="price" value="80"></property>
                </bean>
                <ref bean="refbook"></ref>
            </list>
        </property>
        <property name="maps">
            <map>
                <entry key="key01" value="張三"></entry>
                <entry key="key02" value="18"></entry>
                <entry key="key03" value-ref="refbook"></entry>
                <entry key="key04">
                    <bean class="com.author.bean.car">
                        <property name="name" value="寶馬">
                        </property>
                    </bean>
                </entry>
            </map>
        </property>
    </bean>

在主函式中,輸出結果:

user beanUser2=(user)aContext.getBean("user06");
        System.out.println(beanUser2.books);
        System.out.println(beanUser2.maps);

結果為:

 

 

 ②Properties

使用<props>定義java.util.Properties,該標籤使用多個<prop>作為子標籤。每個<prop>標籤必須定義key屬性

 

<bean class="com.atguigu.spring.bean.DataSource" id="dataSource">
    <property name="properties">
        <props>
            <prop key="userName">root</prop>
            <prop key="password">root</prop>
            <prop key="url">jdbc:mysql:///test</prop>
            <prop key="driverClass">com.mysql.jdbc.Driver</prop>
        </props>
    </property>
</bean>

 

③集合型別的bean

如果只能將集合物件配置在某個bean內部,則這個集合的配置將不能重用。我們需要將集合bean的配置拿到外面,供其他bean引用。

配置集合型別的bean需要引入util名稱空間:xmlns:util="http://www.springframework.org/schema/util"

 

<util:map id="myMap">
        <entry key="key01" value="張三"></entry>
                <entry key="key02" value="18"></entry>
                <entry key="key03" value-ref="refbook"></entry>
                <entry key="key04">
                    <bean class="com.author.bean.car">
                        <property name="name" value="寶馬">
                        </property>
                    </bean>
                </entry>
    </util:map>
    
    <util:list id="myList">
        <bean class="com.author.bean.Book"></bean>
        <value>12</value>
        <ref bean="myMap"></ref>
    </util:list>

 

五、級聯屬性

含義:可以控制屬性的屬性

可以改變user07下的car的price屬性,如果car為引用物件,那麼引用物件也會被修改

<!-- 級聯屬性可以控制屬性的屬性 -->
    <bean id="user07" class="com.author.bean.user">
        <property name="car" ref="car01"></property>
        <property name="car.price" value="900000"></property>
    </bean>

 

--------------這就是今天分享的bean的配置操作。

明天學習:利用工廠來建立bean

&n