Spring5.X bean自動裝配Autowire屬性
阿新 • • 發佈:2020-07-15
屬性注入
- set方法、建構函式、POJO、list、map、ref,屬於手工注入,點我直達
Spring自動注入
- 使用<bean>元素的autowire屬性為一個bean定義指定自動裝配模式
- autowire設定值
- no:沒有開啟
- byName:根據bean的id名稱,注入到對應的屬性裡面
- byType:根據bean需要注入的型別,注入到對應的屬性裡面
- 如果按照型別注入,存在2個以上bean的話會拋異常
- expected single matching bean but found 2
- construcctor:通過建構函式注入,需要這個型別的建構函式
byName演示
applicationContext.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.xsd"> <bean id="video" class="net.cybclass.sp.domain.Video"> <property name="id" value="8"></property> <property name="title" value="SpringBoot課程專題"></property> </bean> <bean id="videoOrder" class="net.cybclass.sp.domain.VideoOrder" autowire="byName"> <property name="id" value="8"></property> <property name="outTradeNo" value="12312"></property> </bean> </beans>
Video.java
package net.cybclass.sp.domain; public class Video { public Video() { System.out.println("Video 預設空建構函式被呼叫"); } { System.out.println("Video 構造塊被呼叫"); } static { System.out.println("Video static 靜態程式碼塊被呼叫"); } public void init() { System.out.println("Video init 被呼叫類"); } public void destroy() { System.out.println("Video destroy 被呼叫類"); } private int id; private String title; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } @Override public String toString() { return "Video{" + "id=" + id + ", title='" + title + '\'' + '}'; } }
VideoOrder.java
package net.cybclass.sp.domain; public class VideoOrder { private int id; //訂單號 private String outTradeNo; private Video video; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getOutTradeNo() { return outTradeNo; } public void setOutTradeNo(String outTradeNo) { this.outTradeNo = outTradeNo; } public Video getVideo() { return video; } public void setVideo(Video video) { this.video = video; } @Override public String toString() { return "VideoOrder{" + "id=" + id + ", outTradeNo='" + outTradeNo + '\'' + ", video=" + video + '}'; } }
從上我們可以看到byName注入,自動獲取bean的id等於video的,當修改bean的id的值為video2的時候,就自動注入不到值類
byType演示
下面演示註冊2次bean的,會拋異常
expected single matching bean but found 2: video2,video3
constructor演示
為VideoOrder.java新增建構函式
修改applicationContext.xml
底層也是根據byType注入的