1. 程式人生 > 實用技巧 >Spring——自動裝配的三種實現方式

Spring——自動裝配的三種實現方式

  • spring會在上下文中自動尋找,並自動給bean裝配屬性

  • 自動裝配的三種方式

    (1).在xml中顯式的裝配

    (2).在java中顯式的裝配

    (3).隱式的自動裝配bean
    這裡主要講第三種

1.測試環境搭建
public class Cat {
    public void bark(){
    	System.out.println("miao...");
    }
}
public class Dog {
    public void bark(){
    	System.out.println("wang...");
    }
}
public class People {
    Cat cat;
    Dog dog;

    public Cat getCat() {
    return cat;
    }

    public void setCat(Cat cat) {
    this.cat = cat;
    }

    public Dog getDog() {
    return dog;
    }

    public void setDog(Dog dog) {
    this.dog = dog;
    }
}
2.byName:會自動在容器上下文中,通過set方法中的引數名
去查詢相同id的<bean>
<bean id="dog" class="com.guan.bean.Dog"></bean>
<bean id="cat" class="com.guan.bean.Cat"></bean>

<bean id="people" class="com.guan.bean.People" autowire="byName"></bean>
3.byType:會自動在容器上下文中,通過自己物件屬性
型別相同的bean
<bean id="dog" class="com.guan.bean.Dog"></bean>
<bean id="cat" class="com.guan.bean.Cat"></bean>

<bean id="people" class="com.guan.bean.People" autowire="byType"></bean>

注意

  • byName需要保證<bean>的id唯一
  • byType需要保證<bean>的type唯一
4.使用註解實現自動裝配

使用:

  1. 匯入約束

  2. 配置註解的支援

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:context="http://www.springframework.org/schema/context"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
            https://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/context
            https://www.springframework.org/schema/context/spring-context.xsd">
    
        <context:annotation-config/>
    
    </beans>
    

常用註解:

  1. @Autowired:需要配置spring,直接在屬性上使用.先使用byType,再使用byName?

    required(default true):預設不需Null

    public class People {
        @Autowired
        Cat cat;
        @Autowired
        Dog dog;
    }
    

    @Qualifier:當屬性名和容器中<bean>中的id不同時,可以通過該註解為屬性"起別名"

    public class People {
        @Autowired
        @Qualifier("cat12")
        Cat cat;
        @Autowired
        Dog dog;
    }
    
  2. @Resource:jdk註解

    name:用於起別名

區別:

  1. 實現方式:

    (1).@Autoword先通過byType實現,如果有重複再通過byName,而且預設要求物件存在

    表現:同一個型別,不同名稱,<bean id="dog123" class="com.guan.bean.Dog"></bean>,可以匹配;同一個名稱,型別不匹配時,<bean id="dog" class="com.guan.bean.Cat"></bean>,如果只要一個對應的型別可以自動匹配,如果有多個對應的型別會報錯

    (2).@Resource預設通過byName實現,如果找不到name,才通過byType,否則報錯

    表現:如果有一個同名的不同型別<bean id="cat" class="com.guan.bean.Dog"></bean>,會直接報錯對應的型別不匹配;如果有一個同類型的,但是不同名的,可以匹配;如果有多個同類型且不同名,無法匹配

總結:實際上xml檔案中一般存放的核心配置檔案,一般的配置可以用其它方式