spring學習(一)(beans.xml的注值配置)


在spring 剛開始學習的時候,就只有簡單的注值,在beans.xml中進行配置,將各種類交給spring來管理。這里,有幾種簡單的beans.xml的配置方法。

有多種bean的配置方法,大體上分為三種,一種為通過構造函數來配置,一種通過屬性來配置,還有一種是通過p空間來配置。一下來簡單說說這三種配置方法。

配置之前,先來幾個實體類,以下的配置都是基於這幾個實體類。

package com.yc.spring02;

public class Student {
    
    private String sid;
    private String name;
    private String  sex;
    
    private Address address;

    @Override
    public String toString() {
        return "Student [sid=" + sid + ", name=" + name + ", sex=" + sex + ", address=" + address + "]";
    }

    public String getSid() {
        return sid;
    }

    public void setSid(String sid) {
        this.sid = sid;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        result = prime * result + ((sex == null) ? 0 : sex.hashCode());
        result = prime * result + ((sid == null) ? 0 : sid.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Student other = (Student) obj;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        if (sex == null) {
            if (other.sex != null)
                return false;
        } else if (!sex.equals(other.sex))
            return false;
        if (sid == null) {
            if (other.sid != null)
                return false;
        } else if (!sid.equals(other.sid))
            return false;
        return true;
    }

    public Student(String sid, String name, String sex) {
        super();
        this.sid = sid;
        this.name = name;
        this.sex = sex;
    }

    public Student() {
        super();
    }

    public Student(String sid, String name, String sex, Address address) {
        super();
        this.sid = sid;
        this.name = name;
        this.sex = sex;
        this.address = address;
    }
    
    public Student(Address address){
        this.address = address;
    }
    
}
Student.java

Address類:

package com.yc.spring02;

public class Address {
    private String country;
    private String city;
    
    @Override
    public String toString() {
        return "Address [country=" + country + ", city=" + city + "]";
    }

    public String getCountry() {
        return country;
    }

    public void setCountry(String country) {
        this.country = country;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((city == null) ? 0 : city.hashCode());
        result = prime * result + ((country == null) ? 0 : country.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Address other = (Address) obj;
        if (city == null) {
            if (other.city != null)
                return false;
        } else if (!city.equals(other.city))
            return false;
        if (country == null) {
            if (other.country != null)
                return false;
        } else if (!country.equals(other.country))
            return false;
        return true;
    }

    public Address(String country, String city) {
        super();
        this.country = country;
        this.city = city;
    }

    public Address() {
        super();
    }
    
    
    
    
}
Address

關系:Student類中有一個address屬性,該屬性的類型是Address

好了現在簡單來講講bean的配置。

(一)通過構造函數來配置。

   <!-- 通過構造函數注值 
            有三種方法,方法一:不指定具體的屬性,但是要按照構造方法的順序來注值
        -->
        <bean id="student01" class="com.yc.spring02.Student">
            <constructor-arg value="YC001"></constructor-arg>
            <constructor-arg value="yc"></constructor-arg>
            <constructor-arg value="男"></constructor-arg>
        </bean>
        
        <!-- 方法二:指定具體屬性,順序可以不管 -->
         <bean id="student02" class="com.yc.spring02.Student">
            <constructor-arg name = "name" value="yc"></constructor-arg>
            <constructor-arg name = "sex" value="男"></constructor-arg>
            <constructor-arg name = "sid" value="YC001"></constructor-arg>
        </bean>
        
        <!-- 方法三:通過指定索引來注值,索引下標從0開始, 索引的位置必須要與構造函數的參數順序對應 -->
         <bean id="student03" class="com.yc.spring02.Student">
            <constructor-arg index="1" value="yc"></constructor-arg>
            <constructor-arg index="2" value="男"></constructor-arg>
            <constructor-arg index="0" value="YC001"></constructor-arg>
        </bean>
    

注意:要想要構造方法配置,則在實體類中必須要有對應的構造方法。

 

(二)通過屬性來配置

注意:通過屬性來配置時,要有實體類中要有對應的set方法,如果沒有,則配置失敗

         <!-- 給屬性賦空值,如果使用的是property的方式,則不寫屬性就可以注為空值,詳見如下:給address注空值 -->
         <bean id="student06" class="com.yc.spring02.Student">
            <property name="sid" value="yc001"></property>
             <property name="name" value="yc"></property>
             <property name="sex" value="男"></property>
        <property name="address" ref="addr01"></property><!-- 引用另一個bean的id-->
</bean>

來個小結:關於構造方法配置和屬性配置兩種,可以混用,同時,還有一些騷操作,如下:

 <bean id="student07" class="com.yc.spring02.Student">
            <constructor-arg index="1" value="yc"></constructor-arg>
            <constructor-arg index="2" value="男"></constructor-arg>
            <constructor-arg index="0" value="YC001"></constructor-arg>
            <constructor-arg index="3">
                <null/>
            </constructor-arg>
         </bean>
         
         
        <!-- 在注值中添加特殊字符 -->
            <bean id="addr01" class="com.yc.spring02.Address">
                <property name="country" value="中國"></property>
                <property name="city">
                    <!-- CDATA[]:表示字符串的意思 -->                
                    <value><![CDATA[<衡陽>]]></value>
                </property>
            </bean>
            <!-- 注值混用 :構造方法和屬性注值方法混用-->
             <bean id="student04" class="com.yc.spring02.Student">
            <constructor-arg index="1" value="yc"></constructor-arg>
            <constructor-arg index="2" value="男"></constructor-arg>
            <constructor-arg index="0" value="YC001"></constructor-arg>
            <property name="address" ref = "addr01"></property><!-- 引用另一個bean的id-->
        </bean>
        
        <!-- 注值嵌套使用 -->
         <bean id="student05" class="com.yc.spring02.Student">
             <property name="sid" value="yc001"></property>
             <property name="name" value="yc"></property>
             <property name="sex" value="男"></property>
             <property name="address" ><!-- 不使用引用,直接嵌套進來 -->
                 <bean class="com.yc.spring02.Address">
                     <property name="country" value="中國"></property>
                     <property name="city" value="長沙"></property>
                 </bean>
             </property>
         </bean>
        

 

(三)p命名空間的使用,p命名空間可以是配置簡化,要想使用p空間,則要添加p空間的聲明:xmlns:p="http://www.springframework.org/schema/p" ,放在beans標簽里面,

具體p空間的使用如下:

    <!-- p命名空間的使用 -->
         
         <!-- 如果屬性引用的是另一個對象,則使用p:屬性名-ref="id值" -->
         <!-- 手動裝配 -->
         <bean id="student08" class="com.yc.spring02.Student" p:sid="yc002" p:name="yc" p:sex="男" p:address-ref="addr01"></bean> 
         
         <!-- 自動裝配 
             byName :根據名字裝配,要求屬性名和id值要相同,必須要求這個xml里面有一個屬性名和id值相同的才能夠注值成功
         -->
         <bean id="student09" class="com.yc.spring02.Student" p:sid="yc002" p:name="yc" p:sex="男"  autowire="byName"></bean> 
         
         <bean id="address" class="com.yc.spring02.Address">
                <property name="country" value="中國"></property>
                <property name="city" value="常數"></property>
           </bean>
         
         <!-- byType:根據類型自動裝配,那么要求在容器里面這個類型只有一個對象存在, 如果有多個bean里面的類路徑和要裝配的對象類路徑相同,則裝配不成功 -->
         <!-- <bean id="student11" class="com.yc.spring02.Student" p:sid="yc002" p:name="yc" p:sex="男"  autowire="byType"></bean> 
          -->
         
         <!-- default :默認情況下不自動裝配 -->
          <bean id="student12" class="com.yc.spring02.Student" p:sid="yc002" p:name="yc" p:sex="男"  autowire="default"></bean> 
         
         
         <!-- 根據 構造方法裝配-->
         <bean id="student13" class="com.yc.spring02.Student" p:sid="yc002" p:name="yc" p:sex="男"  autowire="constructor"></bean> 
         
         
             <!-- bean與bean之間的關系 
             繼承:parent:
             依賴:depends-on
          -->
          <!-- 繼承 -->
          <bean id="addr03" class="com.yc.spring02.Address" p:country="湖南" p:city="長沙" ></bean>
         <bean id="addr04" class="com.yc.spring02.Address" parent="addr03" p:city="衡陽"></bean>
         <!-- 依賴
             如果沒有寫依賴,則自動注值的時候如果找不到對應的id,則不會報錯,只會不注值;如果寫了依賴,則找不到的時候就會報錯
          -->
         <bean id="student10" class="com.yc.spring02.Student" p:sid="yc002" p:name="yc" p:sex="男"  autowire="byName" depends-on="address"></bean> 
        
        <!-- bean的作用域范圍
            singleton:單例模式,默認就是這個
            prototype:每次通過getBean()方法都會重新生成一個實例
         -->
         <bean id="student14" class="com.yc.spring02.Student" p:sid="yc002" p:name="yc" p:sex="男" p:address-ref="addr01" scope="prototype"></bean> 
        
        

 

當然,在beans.xml中還可以引用另一個xml配置文件:

 <!-- 導入另一個XMl文件 -->
        <import resource="list.xml" />
       

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM