spring心得5--構造器注入@設定控制@案例加註解剖析

y_keven發表於2013-04-25

1.設定引用空物件的情況

設定null:

  <property name="barlist">

         <null/>

  </property>

    這種設定多出在一個bean例項引用另一個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

           http://www.springframework.org/schema/beans/spring-beans.xsd">

   <bean id="memberBean" class="www.csdn.spring.constructor.MemberBean">

      <!-- value="null" 這裡給value賦的是一個空字串,而不是一個null空值 -->

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

      <property name="member">

        <null/>

      </property>

   </bean>

 

</beans>

   測試類

package www.csdn.spring.constructor;

 

import org.junit.Test;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

 

public class TestMemberBean {

       

       @Test

       public void testBean(){

              ApplicationContext context = new ClassPathXmlApplicationContext("spring-null.xml");

         MemberBean member = context.getBean("memberBean",MemberBean.class);

         System.out.println(member.name);

         System.out.println(member.member);

       }

 

}


 

2.構造器注入

    構造器注入是Set注入的替代;set注入是一種直接方式缺點是它假設了所有的可變屬性都可以通過set方法訪問到。例如有些屬性在建立時設定一次,以後不再改變。替代方式是通過建構函式設定一些屬性值

    set注入的缺點是無法清晰表達哪些屬性是必須的,哪些是可選的,構造注入的優勢是通過構造強制依賴關係,不可能例項化不完全的或無法使用的bean

解決建構函式引數不確定性

    建構函式多或引數型別大都相同該如何處理?

    spring並不是按照引數的順序來配置引數的。有三種方法來解決構造引數的不確定性:序號和型別,屬性名字指明。<constructor-arg>有一個可選的index屬性,可用來指定引數的順序。

3.構造器案例剖析

配置檔案

<?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

           http://www.springframework.org/schema/beans/spring-beans.xsd">

 

   <!-- 1、通過建構函式注入,採用預設配備方式注入值,這是最原始的方式 ,已由以下三種所代替 ;這裡spring容器會去自動為你去匹配,但是會出現型別不匹配的錯-->

   <bean id="employeeBean" class="www.csdn.spring.constructor.EmployeeBean">

      <constructor-arg value="楊凱" />

      <constructor-arg value="男" />

      <constructor-arg value="5000" />

      <constructor-arg ref="deptmentBean" />

   </bean>

 

   <!-- 1、根據構造器引數的型別 ;這裡需要注意的是類型別的需要加上包名指明,基本型別的不需要;特殊的注意的是這裡不會自動拆箱裝箱;bean例項使用的是基本型別這裡就用基本型別注入,

      使用額是基本型別對應的類型別就用加包名的類型別指明 -->

   <!-- <bean id="employeeBean" class="www.csdn.spring.constructor.EmployeeBean"> 

      <constructor-arg type="java.lang.String" value="楊凱" /> 

      <constructor-arg type="java.lang.String" value="男" /> 

      <constructor-arg type="double" value="5000.00" />

        <constructor-arg type="www.csdn.spring.constructor.DeptmentBean" ref="deptmentBean" />

   </bean> -->

 

   <!-- 3、根據索引index注入 -->

   <!-- <bean id="employeeBean" class="www.csdn.spring.constructor.EmployeeBean"> 

      <constructor-arg index="0" value="楊凱df"/> 

      <constructor-arg index="1" value="男"/> 

      <constructor-arg index="2" value="1000.00"/> 

      <constructor-arg index="3" ref="deptmentBean"/> 

   </bean> -->

 

   <!-- 4.根據屬性名注入值,開發中最常用的一種構造器注入模式 -->

   <!-- <bean id="employeeBean" class="www.csdn.spring.constructor.EmployeeBean">

   <constructor-arg name="name" value="楊凱" />

   <constructor-arg name="sex" value="男" />

   <constructor-arg name="salary" value="5000.00" />

   <constructor-arg name="dept" ref="deptmentBean" />

    </bean> -->

 

   <bean id="deptmentBean" class="www.csdn.spring.constructor.DeptmentBean">

      <property name="name" value="開發部" />

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

   </bean>

 

</beans>

bean例項

package www.csdn.spring.constructor;

 

publicclass EmployeeBean {

   

   private String name;

   private String sex;

   privatedoublesalary;

   private DeptmentBean dept;

 

 

   public EmployeeBean(String name, String sex, double salary,

         DeptmentBean dept) {

      super();

      this.name = name;

      this.sex = sex;

      this.salary = salary;

      this.dept = dept;

   }

 

 

   @Override

   public String toString() {

      return"EmployeeBean [name=" + name + ", sex=" + sex + ", salary="

            + salary + ", dept=" + dept + "]";

   }

}

輔助bean例項

package www.csdn.spring.constructor;

 

publicclass DeptmentBean {

   

   private String name;

   private Integer deptNo;

   

   publicvoid setName(String name) {

      this.name = name;

   }

   publicvoid setDeptNo(Integer deptNo) {

      this.deptNo = deptNo;

   }

   @Override

   public String toString() {

      return"deptment [name=" + name + ", deptNo=" + deptNo + "]";

   }

 

}

測試類

package www.csdn.spring.constructor;

 

import org.junit.Test;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

 

public class TestEmployeeBean {

       

       @Test

       public void testBean(){

       ApplicationContext context = new ClassPathXmlApplicationContext("spring-constructor.xml");

       System.out.println(context.getBean("employeeBean",EmployeeBean.class).toString());

       }

}


 

相關文章