Spring框架學(xué)習(xí)之Spring?@Autowired實現(xiàn)自動裝配的代碼
學(xué)習(xí)自動裝配之前,講一個概念:Component,即組件。組件你也可以理解為bean對象,只不過通常Component的組成會稍微復(fù)雜一些,比如,一個組件里面會引用一個或多個別的bean對象,組件的定義方式也不一樣。自動裝配貌似就是為組件而生的。
自動裝配(Autowired)這個概念,如果你已經(jīng)使用過SpringMVC或者SpringBoot做開發(fā),你會發(fā)現(xiàn)@Autowired注解是特別經(jīng)常使用到的。比如你的Controller、Service相關(guān)的類里面就會經(jīng)常用到。如果你看過@Controller或者@Service的定義,你會發(fā)現(xiàn)這兩個注解也是使用了@Component注解的,就是說這兩個注解也是Component。
自動裝配就是說,你不用手動實現(xiàn)bean之間的組合關(guān)系,只要使用了@Autowired注解,程序就會自動的注入這個需要的bean,前提是你的Spring容器有這個bean。我們來看個例子。
這個例子是這么回事,我定義了一個Car接口,里面有一個run()方法,然后我定義了一個BaoMaCar,實現(xiàn)了Car接口,然后我定義了一個Test.java類,我在BaoMaCar和Test上使用了@Component注解,表明我這兩個類需要創(chuàng)建由Spring管理的bean對象,有點繞,這么說會更好理解:使用了@Component之后,Spring會使用這兩個類創(chuàng)建出相應(yīng)的bean對象,并放到容器中。還有一個MyConfig.java類,上面使用了@Configuration和@ComponentScan注解,這個類是一個Spring配置類,如果你沒有看過我的上一篇文章,建議你看一下,上篇文章介紹了使用Java配置Spring的方式。因為我要啟動Spring上下文就是需要這個配置類,同時我也需要讓Spring發(fā)現(xiàn)這些我聲明的Component,所以還需要使用@Component注解(中文意思:組件掃描),參數(shù)是當(dāng)前的包,默認(rèn)就掃描當(dāng)前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(); } }
你可能覺得我說半天跟自動配置有什么關(guān)系?看一下最后一個類——Test.java,里面用到了@Autowired注解,當(dāng)我啟動main()方法的時候,你猜會發(fā)生什么?控制臺會打印:“小白正在開車”。是不是覺得好奇怪?這是怎么做到的?聽我為你慢慢道來。我從上下文中拿到了一個Test類的對象,我Test類本身就是使用了@Component注解的,所以上下文啟動之后容器中就已經(jīng)創(chuàng)建好了Test的對象。那Test對象的Car car屬性怎么會沒有報空指針錯誤呢?沒錯了,就是在創(chuàng)建Test的對象時,Spring發(fā)現(xiàn)這個類的Car car屬性使用@Autowired注解,于是就在容器中找實現(xiàn)了Car接口的對象,一番搜索之后,找到了BaoMaCar的對象,于是就把這個對象注入到Test的對象的car屬性中了。是不是很厲害?當(dāng)然了,當(dāng)容器中有多個實現(xiàn)了Car接口的對象時,這個寫法是有問題的,因為Spring知道你需要一個實現(xiàn)了Car接口的對象,但是由于有多個符合這個條件的對象,所以無法實現(xiàn)幫你自動注入,因此會發(fā)生異常。解決的辦法就好幾種。我就不一一列舉了,還是那句話,師傅領(lǐng)進(jìn)門,修行靠個人,你應(yīng)該自己去探索一下。
到此這篇關(guān)于Spring @Autowired實現(xiàn)自動裝配的文章就介紹到這了,更多相關(guān)Spring @Autowired自動裝配內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
微服務(wù)間調(diào)用Retrofit在Spring?Cloud?Alibaba中的使用
這篇文章主要為大家介紹了微服務(wù)間調(diào)用Retrofit在Spring?Cloud?Alibaba中的使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06Java基于Swing和netty實現(xiàn)仿QQ界面聊天小項目
這篇文章主要為大家詳細(xì)介紹了Java如何利用Swing和netty實現(xiàn)仿QQ界面聊天小項目,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2022-09-09Spring security認(rèn)證兩類用戶代碼實例
這篇文章主要介紹了Spring security認(rèn)證兩類用戶代碼實例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-06-06