1. 程式人生 > 其它 >02-Spring基於XML的Bean屬性注入

02-Spring基於XML的Bean屬性注入

屬性值注入:就是給屬性賦值

  • 建立一個Account類:
public class Account implements Serializable {
    private int aid;
    private double balance;

    public int getAid() {
        return aid;
    }

    public void setAid(int aid) {
        this.aid = aid;
    }

    public double getBalance() {
        return balance;
    }

    public void setBalance(double balance) {
        this.balance = balance;
    }

    @Override
    public String toString() {
        return "Account{" +
                "aid=" + aid +
                ", balance=" + balance +
                '}';
    }
}

  • 建立一個User類:
public class User implements Serializable {
    private String name;
    private int age;
    //引用資料型別
    private Account account;

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Account getAccount() {
        return account;
    }

    public void setAccount(Account account) {
        this.account = account;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", account=" + account +
                '}';
    }
}

1. 簡單資料型別和引用資料型別的屬性注入

1.1 寫配置檔案

​ 將User類交給Spring容器管理,在xml配置檔案中新增<bean>

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd">
	<!-- 將User類交由Spring容器管理-->
    <bean id="user" class="com.yd.pojo.User">
        <!-- 給物件屬性注入值-->
        <!-- 相當於:user.setName("王二");-->
        <property name="name" value="王二"></property>
        <!-- 相當於:user.setAge(20);-->
        <property name="age" value="20"></property>
        <!-- 給引用型別屬性注入值-->
        <property name="account" ref="account"></property>
    </bean>
    
    <bean id="account" class="com.yd.pojo.Account">
        <property name="aid" value="101"></property>
        <property name="balance" value="1888"></property>
    </bean>

</beans>

1.2 執行程式碼

@Test
public void getUser(){
    //獲取spring配置檔案生成的物件
    ApplicationContext ac = new ClassPathXmlApplicationContext("spring.xml");
    //通過bean的id,獲取bean物件
    User user = (User)ac.getBean("user");
    System.out.println(user);
}

執行結果:

2. 構造器注入

  • 給類加上無參構造和有參構造

2.1 配置檔案注入

使用

  • 構造引數有幾個就要寫幾個,要與構造方法匹配
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="user" class="com.yd.pojo.User">
        <constructor-arg name="name" value="小麗"></constructor-arg>
        <constructor-arg name="age" value="18"></constructor-arg>
        <constructor-arg name="account" ref="account"></constructor-arg>
    </bean>

    <bean id="account" class="com.yd.pojo.Account">
        <constructor-arg name="aid" value="201"></constructor-arg>
        <constructor-arg name="balance" value="9999.05"></constructor-arg>
    </bean>

</beans>

2.2 執行上面1.2的程式碼

執行結果:

3. 自動注入

3.1 根據型別 autowire="byType"(區域性)

  • 將User類的構造方法新增一個兩個引數的構造,與xml匹配
  • 在對應的bean標籤上新增屬性autowire="byType"
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd">
    
	<!--autowire="byType" 根據型別自動注入-->
    <bean id="user" class="com.yd.pojo.User" autowire="byType">
        <constructor-arg name="name" value="小麗"></constructor-arg>
        <constructor-arg name="age" value="18"></constructor-arg>
    </bean>

    <bean id="account" class="com.yd.pojo.Account">
        <constructor-arg name="aid" value="201"></constructor-arg>
        <constructor-arg name="balance" value="8888.08"></constructor-arg>
    </bean>

</beans>

執行1.2程式碼結果:

3.2 根據屬性名 autowire="byName"(區域性)

  • 使用值注入,就不用帶參構造(也可以同3.1使用構造注入)
  • 在對應的bean標籤上新增屬性autowire="byName"
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd">
    
    <!--autowire="byName" 根據屬性名自動注入-->
    <bean id="user" class="com.yd.pojo.User" autowire="byName">
        <property name="name" value="小王"></property>
        <property name="age" value="23"></property>
    </bean>

    <bean id="account" class="com.yd.pojo.Account">
        <constructor-arg name="aid" value="201"></constructor-arg>
        <constructor-arg name="balance" value="8888.08"></constructor-arg>
    </bean>

</beans>

執行1.2程式碼結果:

3.3 全域性設定自動注入

  • 在最大的<beans>標籤中新增全域性自動注入default-autowire="byType"
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd"
        default-autowire="byType">

    <bean id="user" class="com.yd.pojo.User">
        <property name="name" value="小李"></property>
        <property name="age" value="30"></property>
    </bean>

    <bean id="account" class="com.yd.pojo.Account">
        <constructor-arg name="aid" value="301"></constructor-arg>
        <constructor-arg name="balance" value="6666.08"></constructor-arg>
    </bean>

</beans>

執行1.2程式碼結果:

4. 總結

  • 區域性注入只針對單個的bean物件;
  • 全域性注入針對的是<beans>下所有的bean物件;
  • 開發中推薦使用autowire="byType",全域性/區域性根據實際情況選擇。

4. 空值注入

  • <value/>
  • value = ""
  • <null/>表示的是null,空指標
  • value = "null" 表示的是“null”字串

**** 注意:注意區分空指標和null字串!

5. 集合屬性注入(array、set、list、map、properties)(瞭解)

  • 建一個Data類放以上屬性(需包含get/set/toString方法)
  • xml配置bean
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd"
        default-autowire="byName">

    <bean id="data" class="com.yd.pojo.Data">
        <property name="array">
            <array>
                <value>蘇州</value>
                <value>無錫</value>
                <value>常州</value>
            </array>
        </property>
        <property name="list">
            <list>
                <value>蒸羊羔</value>
                <value>蒸熊掌</value>
                <value>蒸鹿尾</value>
            </list>
        </property>
        <property name="set">
            <set>
                <value>北京</value>
                <value>北京</value>
                <value>天津</value>
                <value>河北</value>
            </set>
        </property>
        <property name="map">
            <map>
                <entry key="101" value="張三"/>
                <entry key="102" value="李四"/>
                <entry key="103" value="王五"/>
            </map>
        </property>
        <property name="properties">
            <props>
                <prop key="user">root</prop>
                <prop key="pwd">123456</prop>
                <prop key="sex">male</prop>
            </props>
        </property>
    </bean>

</beans>
  • 執行程式碼
@Test
public void getData(){
    //獲取spring配置檔案生成的物件
    ApplicationContext ac = new ClassPathXmlApplicationContext("spring.xml");
    Data data = (Data) ac.getBean("data");
    System.out.println(data);
}
  • 執行結果:
  • 注意:1. set集合存放不重複的資料

    ​ 2. default-autowire="byName",若是byType,properties會自動注入系統預設屬性值(系統配置資訊等)