Spring框架學習之Spring @Autowired實現自動裝配的代碼

學習自動裝配之前,講一個概念:Component,即組件。組件你也可以理解為bean對象,隻不過通常Component的組成會稍微復雜一些,比如,一個組件裡面會引用一個或多個別的bean對象,組件的定義方式也不一樣。自動裝配貌似就是為組件而生的。

自動裝配(Autowired)這個概念,如果你已經使用過SpringMVC或者SpringBoot做開發,你會發現@Autowired註解是特別經常使用到的。比如你的Controller、Service相關的類裡面就會經常用到。如果你看過@Controller或者@Service的定義,你會發現這兩個註解也是使用瞭@Component註解的,就是說這兩個註解也是Component。

自動裝配就是說,你不用手動實現bean之間的組合關系,隻要使用瞭@Autowired註解,程序就會自動的註入這個需要的bean,前提是你的Spring容器有這個bean。我們來看個例子。

這個例子是這麼回事,我定義瞭一個Car接口,裡面有一個run()方法,然後我定義瞭一個BaoMaCar,實現瞭Car接口,然後我定義瞭一個Test.java類,我在BaoMaCar和Test上使用瞭@Component註解,表明我這兩個類需要創建由Spring管理的bean對象,有點繞,這麼說會更好理解:使用瞭@Component之後,Spring會使用這兩個類創建出相應的bean對象,並放到容器中。還有一個MyConfig.java類,上面使用瞭@Configuration和@ComponentScan註解,這個類是一個Spring配置類,如果你沒有看過我的上一篇文章,建議你看一下,上篇文章介紹瞭使用Java配置Spring的方式。因為我要啟動Spring上下文就是需要這個配置類,同時我也需要讓Spring發現這些我聲明的Component,所以還需要使用@Component註解(中文意思:組件掃描),參數是當前的包,默認就掃描當前package下的所有類,看看哪個類上面使用@Component註解就把哪個類交由Spring管理。直接看代碼吧!

package demo2;

public interface Car {
    void move();
}
package demo2;
import org.springframework.stereotype.Component;
@Component
public class BaoMaCar implements Car {
    private String driver = "小白開";
    public void move() {
        System.out.println(driver+"正在開車");
    }
}
package demo2;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan("demo2")
public class MyConfig {
}
package demo2;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.stereotype.Component;

@Component
public class Test {
    @Autowired
    private Car car;

    public Car getCar() {
        return car;
    }

    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MyConfig.class);
        Test test = context.getBean(Test.class);
        test.getCar().move();
        context.close();
    }
}

你可能覺得我說半天跟自動配置有什麼關系?看一下最後一個類——Test.java,裡面用到瞭@Autowired註解,當我啟動main()方法的時候,你猜會發生什麼?控制臺會打印:“小白正在開車”。是不是覺得好奇怪?這是怎麼做到的?聽我為你慢慢道來。我從上下文中拿到瞭一個Test類的對象,我Test類本身就是使用瞭@Component註解的,所以上下文啟動之後容器中就已經創建好瞭Test的對象。那Test對象的Car car屬性怎麼會沒有報空指針錯誤呢?沒錯瞭,就是在創建Test的對象時,Spring發現這個類的Car car屬性使用@Autowired註解,於是就在容器中找實現瞭Car接口的對象,一番搜索之後,找到瞭BaoMaCar的對象,於是就把這個對象註入到Test的對象的car屬性中瞭。是不是很厲害?當然瞭,當容器中有多個實現瞭Car接口的對象時,這個寫法是有問題的,因為Spring知道你需要一個實現瞭Car接口的對象,但是由於有多個符合這個條件的對象,所以無法實現幫你自動註入,因此會發生異常。解決的辦法就好幾種。我就不一一列舉瞭,還是那句話,師傅領進門,修行靠個人,你應該自己去探索一下。

到此這篇關於Spring @Autowired實現自動裝配的文章就介紹到這瞭,更多相關Spring @Autowired自動裝配內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: