1. 程式人生 > 實用技巧 >Spring5.X bean自動裝配Autowire屬性

Spring5.X bean自動裝配Autowire屬性

屬性注入

  • 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注入的