spring心得6--自動裝配知識點講解及案例分析

y_keven發表於2013-05-05

1.自動裝配

   spring3.2以上版本有四種自動裝配型別:

    1).byName:尋找和屬性名相同的bean,若找不到,則裝不上。

    2).byType:尋找和屬性型別相同的bean,找不到,裝不上,找到多個拋異常。

    3).constructor:按照引數的型別裝配;找不到,裝不上;在有與bean例項類中屬性相同的id時,即使存在同一個型別的多個bean也不會拋異常,否則反之找到多個就會拋異常。

   4)no:不使用自動裝配

   自動裝配主要通過bean標籤的autowire屬性配置相應的自動裝配方式使用byType和constructor自動裝配時,若找到多個符合條件的bean,會報異常,因此最好的方式是不用自動組裝

2.自動裝配案例剖析

   下面主要列出相關的spring配置檔案和主要的bean,用來測試的測試類和輔助就不再贅述了;

主要的bean例項
package www.csdn.spring.autowire;

public class EmpBean {

	private String name;
	private DeptBean deptBean;
	private CompBean compBean;

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

	/*
	 * public void setDeptBean(DeptBean deptBean) { this.deptBean = deptBean; }
	 * public void setCompBean(CompBean compBean) { this.compBean = compBean; }
	 */

	@Override
	public String toString() {
		return "EmpBean [name=" + name + ", deptBean=" + deptBean
				+ ", compBean=" + compBean + "]";
	}

	public EmpBean(DeptBean deptBean, CompBean compBean) {
		super();
		this.deptBean = deptBean;
		this.compBean = compBean;
	}

}
  按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
           http://www.springframework.org/schema/beans/spring-beans.xsd">

       <bean id="compBean" class="www.csdn.spring.autowire.CompBean">
         <property name="name" value="DELL"/>
       </bean>
       
       <bean id="deptBean" class="www.csdn.spring.autowire.DeptBean">
         <property name="name" value="銷售部門"/>
       </bean>
       
       <!-- 使用autoWrie自動裝配,改屬性值byName;
                    能讓其自動裝配的前提是bean例項中的屬性值名稱與配置檔案中引入的型別id一致-->
                    
       <bean id="empBean" class="www.csdn.spring.autowire.EmpBean" autowire="byName">
          <property name="name" value="楊凱"/>
<!--           <property name="comp" ref="compBean"/>
          <property name="dept" ref="deptBean"/> -->
       </bean>
</beans>
按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
           http://www.springframework.org/schema/beans/spring-beans.xsd">

       <bean id="compBean" class="www.csdn.spring.autowire.CompBean">
         <property name="name" value="DELL"/>
       </bean>
       
       <bean id="deptBean" class="www.csdn.spring.autowire.DeptBean">
         <property name="name" value="銷售部門"/>
       </bean>
       <!-- 
          這裡只能出現一個deotBean,id名不一樣但是型別一樣,都是deptBean實體的;id="deptBean"或同型別的不同id都會拋異常
       <bean id="deptBean1" class="www.csdn.spring.autowire.DeptBean">
         <property name="name" value="銷售部門"/>
       </bean> -->
       
       <!-- 使用autoWrie自動裝配,改屬性值byType;
                    按型別自動裝配,前提是同一個型別的只能有一個-->
                    
       <bean id="empBean" class="www.csdn.spring.autowire.EmpBean" autowire="byType">
          <property name="name" value="楊凱"/>
<!--           <property name="comp" ref="compBean"/>
          <property name="dept" ref="deptBean"/> -->
       </bean>
</beans>
   按constructor自動裝配的配置檔案
<?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="compBean" class="www.csdn.spring.autowire.CompBean">
         <property name="name" value="DELL"/>
       </bean>
       
       
       <!-- 在spring3.2以上版本中:使用構造器自動裝配時,如果有一個id與bean例項中的屬性名相同的配置bean存在,雖然構造器自動裝配是按型別自動裝配的,
             但是即使有多個相同型別的bean存在也不受影響;受影響的情況是:沒有與bean例項中的屬性名相同的配置bean存在,
             又有多個相同型別的bean配置,就會拋異常-->
       <bean id="deptBean" class="www.csdn.spring.autowire.DeptBean">
         <property name="name" value="銷售部門"/>
       </bean>
       
       <bean id="deptBean1" class="www.csdn.spring.autowire.DeptBean">
         <property name="name" value="銷售部門"/>
       </bean>

       <bean id="deptBean2" class="www.csdn.spring.autowire.DeptBean">
         <property name="name" value="銷售部門"/>
       </bean> 
       
       <!-- 使用autoWrie自動裝配,改屬性值constructor;構造器自動裝配就是按型別自動裝配
                    beam例項中必須結合構造器使用,如果沒有構造器自動裝配後注入不進去值,取出為空值-->
                    
       <bean id="empBean" class="www.csdn.spring.autowire.EmpBean" autowire="constructor">
          <property name="name" value="楊凱"/>
<!--           <property name="comp" ref="compBean"/>
          <property name="dept" ref="deptBean"/> -->
       </bean>
</beans>

相關文章