你所不知道的——Spring自動(dòng)注入

自動(dòng)注入和@Autowire

@Autowire不屬于自動(dòng)注入!

注入方式(重要)

在Spring官網(wǎng)(https://www.xiaoyuani.com/)上(文檔),定義了在Spring中的注入方式一共有兩種:set方法和構(gòu)造函數(shù)。

也就是說(shuō),你想在A類(lèi)里面注入另外一個(gè)B類(lèi),無(wú)論你是通過(guò)寫(xiě) XML文件,或者通過(guò) @Autowried,他們最終都是通過(guò)這個(gè)A類(lèi)的set方法或者構(gòu)造函數(shù),將B類(lèi)注入到A類(lèi)中!

換句話(huà)說(shuō),你如果A類(lèi)里面沒(méi)有setB(B b){…},那你就別想通過(guò)set方法把B類(lèi)注入到A類(lèi)中

自動(dòng)注入

首先擺出一個(gè)比較顛覆的觀點(diǎn):@Autowire不屬于自動(dòng)注入!

如果要討論自動(dòng)注入,我們先要了解什么是自動(dòng)注入,什么是手動(dòng)注入。

手動(dòng)注入:在Spring 1.x的時(shí)候,我們想要在A類(lèi)中注入B類(lèi),我們只能通過(guò)在xml配置文件中,加上< property >標(biāo)簽。也就是說(shuō),如果我們想在A類(lèi)中注入100個(gè)類(lèi),我們就要重復(fù)著寫(xiě)100個(gè)< property > 。而Spring為了我們能少碼點(diǎn)字,就提供了 @Autowired 注解,通過(guò)這個(gè)注解,我們就可以更加輕松的手動(dòng)注入需要的類(lèi)

自動(dòng)注入:如果在A類(lèi)里面,需要用到B類(lèi),C類(lèi)等等…我不需要重復(fù)著寫(xiě)100個(gè)< property >或者100個(gè)@Autowired。而是只需要注明需要哪些類(lèi)即可

既然是自動(dòng),那就代表我啥都不用做,就連一個(gè) @Autowire 我都不加的情況下我讓B類(lèi)注入進(jìn)A類(lèi),這才算真正的自動(dòng)注入

證明:

首先,我們先看看最原始的,通過(guò)xml的注入類(lèi):

<bean id="exampleBean" class="examples.ExampleBean"> <!-- setter injection using the nested ref element --> <property name="beanOne"> <ref bean="anotherExampleBean"/> </property></bean><bean id="anotherExampleBean" class="examples.AnotherBean"/>12345678

對(duì)應(yīng)的類(lèi):

public class ExampleBean { private AnotherBean beanOne; public void setBeanOne(AnotherBean beanOne) { this.beanOne = beanOne; }}1234567

這是Spring官網(wǎng)上的一個(gè)例子,在最開(kāi)始,我們通過(guò)在XML中追加<property>屬性來(lái)為類(lèi)加上其所需要的類(lèi)。這種手動(dòng)注入的方式十分的繁瑣,所以后面出現(xiàn)了@Autowire注解來(lái)進(jìn)行注入!說(shuō)白了,就是人們?yōu)榱送祽?,用一個(gè)@Autowire注解代替了寫(xiě)一大串的property屬性?。ㄏ冗@么理解,底層源碼肯定不是這么做的?。┻@樣的話(huà),還能說(shuō) @Autowire 是自動(dòng)注入了嗎?

對(duì)于自動(dòng)注入,在Spring中提供了下面4種方式(甚至我可以更加負(fù)責(zé)任的告訴你們,在Spring源碼中有5種)

先根據(jù)官方文檔提供的4種方法進(jìn)行解釋?zhuān)?/p>

no:就是不要自動(dòng)裝配

byName:通過(guò)名字進(jìn)行自動(dòng)裝配

byType:通過(guò)類(lèi)型進(jìn)行自動(dòng)裝配

constructor:通過(guò)構(gòu)造函數(shù)進(jìn)行自動(dòng)裝配

最開(kāi)始我有寫(xiě)到,在Spring中,自動(dòng)注入的方式就只有兩種,通過(guò)set()方法和構(gòu)造函數(shù)。所以 byName和 byType 都是通過(guò)?set()進(jìn)行裝配的。

代碼演示:通過(guò)byType方式進(jìn)行自動(dòng)注入

通過(guò)在<beans>標(biāo)簽的末尾加上?default-autowire="byType"來(lái)實(shí)現(xiàn)Spring的自動(dòng)注入

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd" default-autowire="byType"> <bean id="defaultAutowireService" class="com.spring.autowiringModes.DefaultAutowireService"> </bean> <bean id="byTypeDemo" class="com.spring.autowiringModes.ByTypeDemo"/></beans>12345678910111213

Java類(lèi):

public class DefaultAutowireService { ByTypeDemo byTypeDemo; public ByTypeDemo getByTypeDemo() { return byTypeDemo; } public void setByTypeDemo(ByTypeDemo byTypeDemo) { this.byTypeDemo = byTypeDemo; }}1234567891011

啟動(dòng)類(lèi):

public class XmlTest { public static void main(String[] args) { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring.xml"); DefaultAutowireService bean = context.getBean("defaultAutowireService", DefaultAutowireService.class); System.out.println(bean.getByTypeDemo()); }}12345678910111213

控制臺(tái):

如果這時(shí)我們把xml文件中的default-autowire去掉,重新啟動(dòng)程序并查看控制臺(tái):

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容