你所不知道的Spring自動注入詳解
自動注入和@Autowire
@Autowire不屬于自動注入!
注入方式(重要)
在Spring官網(wǎng)上(文檔),定義了在Spring中的注入方式一共有兩種:set方法和構造函數(shù)。
也就是說,你想在A類里面注入另外一個B類,無論你是通過寫 XML文件,或者通過 @Autowried,他們最終都是通過這個A類的set方法或者構造函數(shù),將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官網(wǎng)上的一個例子,在最開始,我們通過在XML中追加<property>屬性來為類加上其所需要的類。這種手動注入的方式十分的繁瑣,所以后面出現(xiàn)了@Autowire注解來進行注入!說白了,就是人們?yōu)榱送祽?,用一個@Autowire注解代替了寫一大串的property屬性!(先這么理解,底層源碼肯定不是這么做的?。┻@樣的話,還能說 @Autowire 是自動注入了嗎?
對于自動注入,在Spring中提供了下面4種方式(甚至我可以更加負責任的告訴你們,在Spring源碼中有5種)
先根據(jù)官方文檔提供的4種方法進行解釋:
- no:就是不要自動裝配
- byName:通過名字進行自動裝配
- byType:通過類型進行自動裝配
- constructor:通過構造函數(shù)進行自動裝配
最開始我有寫到,在Spring中,自動注入的方式就只有兩種,通過set()方法和構造函數(shù)。所以 byName和 byType 都是通過 set()進行裝配的。
代碼演示:通過byType方式進行自動注入
通過在<beans>
標簽的末尾加上 default-autowire="byType"
來實現(xiàn)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/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>
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
去掉,重新啟動程序并查看控制臺:
紙上得來終覺淺,絕知此事要躬行!希望大家也可以自己寫寫代碼再驗證一下!
總結
到此這篇關于你所不知道的Spring自動注入詳解的文章就介紹到這了,更多相關Spring自動注入內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
SpringBoot和Vue2項目配置https協(xié)議過程
本文詳細介紹了SpringBoot項目和Vue2項目的部署流程及SSL證書配置,對于SpringBoot項目,需將.pfx文件放入resources目錄并配置server,然后打包部署,Vue2項目中,涉及檢查nginx的SSL模塊、編譯新的nginx文件2024-10-10Java同步關鍵字synchronize底層實現(xiàn)原理解析
synchronized關鍵字對大家來說并不陌生,當我們遇到并發(fā)情況時,優(yōu)先會想到用synchronized關鍵字去解決,synchronized確實能夠幫助我們?nèi)ソ鉀Q并發(fā)的問題,接下來通過本文給大家分享java synchronize底層實現(xiàn)原理,感興趣的朋友一起看看吧2021-08-08Spring事務注解@Transactional失效的八種場景分析
最近在開發(fā)采用Spring框架的項目中,使用了@Transactional注解,但發(fā)現(xiàn)事務注解失效了,所以這篇文章主要給大家介紹了關于Spring事務注解@Transactional失效的八種場景,需要的朋友可以參考下2021-05-05SpringCloud?Gateway詳細分析實現(xiàn)負載均衡與熔斷和限流
這篇文章主要介紹了SpringCloud?Gateway實現(xiàn)路由轉發(fā),負載均衡,熔斷和限流,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-07-07Javaweb開發(fā)環(huán)境Myeclipse6.5 JDK1.6 Tomcat6.0 SVN1.8配置教程
這篇文章主要介紹了Javaweb開發(fā)環(huán)境Myeclipse6.5 JDK1.6 Tomcat6.0 SVN1.8配置教程,感興趣的小伙伴們可以參考一下2016-06-06Spring Cloud Alibaba 本地調(diào)試介紹及方案設計
為了解決 本地調(diào)試 的問題,本文實現(xiàn)了一種簡單實用的策略,可以通過 Nacos 動態(tài)配置服務路由,還可以基于用戶,部門,組織等級別配置服務路由,實現(xiàn) 本地調(diào)試 的同時,實際上也實現(xiàn) 灰度發(fā)布,感興趣的朋友跟隨小編一起看看吧2021-07-07