java

你所不知道的——Spring自動注入

自動注入和@Autowire

@Autowire不屬於自動注入!

注入方式(重要)

在Spring官網上(文件),定義了在Spring中的注入方式一共有兩種:set方法建構函式

也就是說,你想在A類裡面注入另外一個B類,無論你是透過寫 XML檔案,或者透過 @Autowried,他們最終都是透過這個A類的set方法或者建構函式,將B類注入到A類中!

換句話說,你如果A類裡面沒有setB(B b){…},那你就別想透過set方法把B類注入到A類中

自動注入

首先擺出一個比較顛覆的觀點:@Autowire不屬於自動注入!

如果要討論自動注入,我們先要了解什麼是自動注入,什麼是手動注入。

  • 手動注入:在Spring 1.x的時候,我們想要在A類中注入B類,我們只能透過在xml配置檔案中,加上< property >標籤。也就是說,如果我們想在A類中注入100個類,我們就要重複著寫100個< property > 。而Spring為了我們能少碼點字,就提供了 @Autowired 註解,透過這個註解,我們就可以更加輕鬆的手動注入需要的類
  • 自動注入:如果在A類裡面,需要用到B類,C類等等…我不需要重複著寫100個< property >或者100個@Autowired。而是隻需要註明需要哪些類即可

既然是自動,那就代表我啥都不用做,就連一個 @Autowire 我都不加的情況下我讓B類注入進A類,這才算真正的自動注入

證明:

首先,我們先看看最原始的,透過xml的注入類:

<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"/>

對應的類:

public class ExampleBean {
    private AnotherBean beanOne;

    public void setBeanOne(AnotherBean beanOne) {
        this.beanOne = beanOne;
    }
}

這是Spring官網上的一個例子,在最開始,我們透過在XML中追加<property>屬性來為類加上其所需要的類。這種手動注入的方式十分的繁瑣,所以後面出現了@Autowire註解來進行注入!說白了,就是人們為了偷懶,用一個@Autowire註解代替了寫一大串的property屬性!(先這麼理解,底層原始碼肯定不是這麼做的!)這樣的話,還能說 @Autowire 是自動注入了嗎?

對於自動注入,在Spring中提供了下面4種方式(甚至我可以更加負責任的告訴你們,在Spring原始碼中有5種)

在這裡插入圖片描述

先根據官方文件提供的4種方法進行解釋:

  1. no:就是不要自動裝配
  2. byName:透過名字進行自動裝配
  3. byType:透過型別進行自動裝配
  4. constructor:透過建構函式進行自動裝配

最開始我有寫到,在Spring中,自動注入的方式就只有兩種,透過set()方法建構函式。所以 byName和 byType 都是透過 set()進行裝配的。


程式碼演示:透過byType方式進行自動注入

透過在<beans>標籤的末尾加上 default-autowire="byType"來實現Spring的自動注入

<?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/-beans.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/-aop.xsd"
		default-autowire="byType">

	<bean id="defaultAutowireService" class="com.spring.autowiringModes.DefaultAutowireService">
	</bean>

	<bean id="byTypeDemo" class="com.spring.autowiringModes.ByTypeDemo"/>

</beans>

Java類:

public class DefaultAutowireService {
	ByTypeDemo byTypeDemo;

	public ByTypeDemo getByTypeDemo() {
		return byTypeDemo;
	}

	public void setByTypeDemo(ByTypeDemo byTypeDemo) {
		this.byTypeDemo = byTypeDemo;
	}
}

啟動類:

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());

	}
}

控制檯:

在這裡插入圖片描述

如果這時我們把xml檔案中的default-autowire去掉,重新啟動程式並檢視控制檯:

在這裡插入圖片描述

紙上得來終覺淺,絕知此事要躬行!希望大家也可以自己寫寫程式碼再驗證一下!如果有任何問題,或者我有那些地方有錯誤希望都大家可以私信我!
感謝閱讀!

本文章已修改原文用詞符合繁體字使用者習慣使其容易閱讀

版權宣告:此處為CSDN博主「ZeS丶」的原創文章,依據CC 4.0 BY-SA版權協議,轉載請附上原文出處連結及本宣告。

原文連結:https://blog.csdn.net/weixin_46357454/article/details/109125108