自動裝配【Spring autowire】

qingyezhu發表於2015-03-07
public class AutoWiringDao {
    private String daoName;

    public void setDaoName(String daoName) {
        this.daoName = daoName;
    }

    public String getDaoName() {
        return daoName;
    }

    public void say(String word) {
        System.out.println(daoName + "===AutoWiringDao===" + word);
    }

}

 

public class AutoWiringService {

    private AutoWiringDao autoWiringDao1;

    private AutoWiringService() {
        System.out.println("無參構造方法");
    }

    private AutoWiringService(AutoWiringDao autoWiringDao3) {
        autoWiringDao1 = autoWiringDao3;
        System.out.println("有參構造方法===" + autoWiringDao1.getDaoName());
    }

    public void setAutoWiringDao1(AutoWiringDao autoWiringDao) {
        autoWiringDao1 = autoWiringDao;
    }

    public void say(String word) {
        autoWiringDao1.say(word);
    }
}

以上是所需要的類AutoWiringService與類AutoWiringDao。

1、byName

spring-autowiring.xml檔案

<?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-4.0.xsd"
    default-autowire="byName"    >  
    <bean id="autoWiringDao" class="com.wangzhu.spring.autowiring.AutoWiringDao">
        <property name="daoName" value="autoWiringDao"/>        
    </bean>
    <bean id="autoWiringDao1" class="com.wangzhu.spring.autowiring.AutoWiringDao">
        <property name="daoName" value="autoWiringDao1"/>        
    </bean>

    <bean id="autoWiringDao2" class="com.wangzhu.spring.autowiring.AutoWiringDao">
        <property name="daoName" value="autoWiringDao2"/>        
    </bean>
    <bean class="com.wangzhu.spring.autowiring.AutoWiringDao">
        <property name="daoName" value="null"/>        
    </bean>
    
    <bean id="autoWiringService" class="com.wangzhu.spring.autowiring.AutoWiringService"></bean>
</beans>

 

測試:

AutoWiringService service = getBean("autoWiringService");
service.say("this is a test autowire!");

輸出:

無參構造方法
autoWiringDao1===AutoWiringDao===this is a test autowire!

備註:通過byName方法進行自動裝配,

1)、需要無參構造方法;

2)、需要有同名的成員變數,以及該變數的set方法。

 

2、byType

只需要更改spring-autowiring.xml檔案

<?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-4.0.xsd"
    default-autowire="byType"    >  
    <bean class="com.wangzhu.spring.autowiring.AutoWiringDao">
        <property name="daoName" value="null"/>        
    </bean>
    
    <bean id="autoWiringService" class="com.wangzhu.spring.autowiring.AutoWiringService"></bean>
</beans>

 

輸出:

無參構造方法
null===AutoWiringDao===this is a test autowire!

備註:通過byType方法進行自動裝配,

1)、需要無參構成方法;

2)、同型別的Bean只能存在一個,否則將丟擲異常;

3)、需要該成員變數的set方法,其變數名隨意,故在spring-autowiring.xml中只需指定該Bean的class即可。

 

3、constructor

只需要更改spring-autowiring.xml檔案

<?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-4.0.xsd"
    default-autowire="constructor"    >
    
    <bean class="com.wangzhu.spring.autowiring.AutoWiringDao">
        <property name="daoName" value="null"/>        
    </bean>
    
    <bean id="autoWiringService" class="com.wangzhu.spring.autowiring.AutoWiringService"></bean>
</beans>

輸出:

有參構造方法===null
null===AutoWiringDao===this is a test autowire!

 

備註:通過constructor方法進行自動裝配,

1)、需要對應的有參構造方法,若無則丟擲異常,當然若有無參構造方法,則不會丟擲異常;

2)、當只有一個同型別的成員變數的Bean時,直接指定該Bean的class即可;

3)、同有多個同型別的成員變數的Bean時,其會根據該Bean的名稱與構造方法中的形參名進行比較,若不一樣,則直接呼叫無參構造方法。

 

相關文章