---
# System prepended metadata

title: bean的自動裝配
tags: [Spring-bean的自動裝配]

---

# bean的自動裝配
###### tags: `Spring-bean的自動裝配`

* 自動裝配是spring滿足bean依賴的一種方式
* Spring會在上下文裝自動尋找，並自動給bean裝配屬性

在Spring中，有三種裝配的方式
1. 在xml中顯式的配置
2. 在java中顯式配置
3. 隱式的自動裝配bean【重要】

### 測試
#### 環境搭建：一個人有兩個寵物
```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
        https://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="cat" class="com.kuang.pojo.Cat"/>
    <bean id="dog" class="com.kuang.pojo.Dog"/>

    <bean id="people" class="com.kuang.pojo.People">
        <property name="name" value="秦心"/>
        <property name="dog" ref="dog"/>
        <property name="cat" ref="cat"/>
    </bean>
</beans>
```

### 自動裝配
#### byName：會自動在容器上下文中查找，和自己對象ser方法後面的值對應的bean-id
**成功案例**
```xml=
    <bean id="cat" class="com.kuang.pojo.Cat"/>
    <bean id="dog" class="com.kuang.pojo.Dog"/>

    <bean id="people" class="com.kuang.pojo.People" autowire="byName">
        <property name="name" value="秦心"/>
    </bean>
```
![](https://i.imgur.com/Xl7Gpqk.png)

**失敗案例：因為people找不到bean id="dog"**
```xml=
    <bean id="cat" class="com.kuang.pojo.Cat"/>
    <bean id="dog222" class="com.kuang.pojo.Dog"/>

    <bean id="people" class="com.kuang.pojo.People" autowire="byName">
        <property name="name" value="秦心"/>
    </bean>
```
![](https://i.imgur.com/7PCHMHM.png)

#### ByType：會自動在容器上下文中查找，和自己對象屬性類型相同的bean-id(必須保證類全局唯一)
**成功案例**
```xml=
    <bean id="cat" class="com.kuang.pojo.Cat"/>
    <bean id="dog" class="com.kuang.pojo.Dog"/>

    <bean id="people" class="com.kuang.pojo.People" autowire="byType">
        <property name="name" value="秦心"/>
    </bean>
```
**失敗案例**
因為有兩個重複的類
```xml=
    <bean id="cat" class="com.kuang.pojo.Cat"/>
    <bean id="dog" class="com.kuang.pojo.Dog"/>
    <bean id="dog1" class="com.kuang.pojo.Dog"/>

    <bean id="people" class="com.kuang.pojo.People" autowire="byType">
        <property name="name" value="秦心"/>
    </bean>
```

**可以只留類**

```xml=
    <bean class="com.kuang.pojo.Cat"/>
    <bean class="com.kuang.pojo.Dog"/>

    <bean id="people" class="com.kuang.pojo.People" autowire="byType">
        <property name="name" value="秦心"/>
    </bean>
```

### 小節：
* byName的時候，需要保證所有bean的id唯一，並且這個bean需要和自動注入的屬性的set方法的值一致
* byType的時候，需要保證所有bean的class唯一，並且這個bean需要和自動注入的屬性的類型一致

![](https://i.imgur.com/OuW1a0u.png)
