你所不知道的Spring自動(dòng)注入詳解
自動(dòng)注入和@Autowire
@Autowire不屬于自動(dòng)注入!
注入方式(重要)
在Spring官網(wǎng)上(文檔),定義了在Spring中的注入方式一共有兩種:set方法和構(gòu)造函數(shù)。
也就是說(shuō),你想在A類里面注入另外一個(gè)B類,無(wú)論你是通過(guò)寫 XML文件,或者通過(guò) @Autowried,他們最終都是通過(guò)這個(gè)A類的set方法或者構(gòu)造函數(shù),將B類注入到A類中!
換句話說(shuō),你如果A類里面沒(méi)有setB(B b){…},那你就別想通過(guò)set方法把B類注入到A類中
自動(dòng)注入
首先擺出一個(gè)比較顛覆的觀點(diǎn):@Autowire不屬于自動(dòng)注入!
如果要討論自動(dòng)注入,我們先要了解什么是自動(dòng)注入,什么是手動(dòng)注入。
- 手動(dòng)注入:在Spring 1.x的時(shí)候,我們想要在A類中注入B類,我們只能通過(guò)在xml配置文件中,加上< property >標(biāo)簽。也就是說(shuō),如果我們想在A類中注入100個(gè)類,我們就要重復(fù)著寫100個(gè)< property > 。而Spring為了我們能少碼點(diǎn)字,就提供了 @Autowired 注解,通過(guò)這個(gè)注解,我們就可以更加輕松的手動(dòng)注入需要的類
- 自動(dòng)注入:如果在A類里面,需要用到B類,C類等等…我不需要重復(fù)著寫100個(gè)< property >或者100個(gè)@Autowired。而是只需要注明需要哪些類即可
既然是自動(dòng),那就代表我啥都不用做,就連一個(gè) @Autowire 我都不加的情況下我讓B類注入進(jìn)A類,這才算真正的自動(dòng)注入
證明:
首先,我們先看看最原始的,通過(guò)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"/>
對(duì)應(yīng)的類:
public class ExampleBean { private AnotherBean beanOne; public void setBeanOne(AnotherBean beanOne) { this.beanOne = beanOne; } }
這是Spring官網(wǎng)上的一個(gè)例子,在最開始,我們通過(guò)在XML中追加<property>屬性來(lái)為類加上其所需要的類。這種手動(dòng)注入的方式十分的繁瑣,所以后面出現(xiàn)了@Autowire注解來(lái)進(jìn)行注入!說(shuō)白了,就是人們?yōu)榱送祽?,用一個(gè)@Autowire注解代替了寫一大串的property屬性?。ㄏ冗@么理解,底層源碼肯定不是這么做的?。┻@樣的話,還能說(shuō) @Autowire 是自動(dòng)注入了嗎?
對(duì)于自動(dòng)注入,在Spring中提供了下面4種方式(甚至我可以更加負(fù)責(zé)任的告訴你們,在Spring源碼中有5種)
先根據(jù)官方文檔提供的4種方法進(jìn)行解釋:
- no:就是不要自動(dòng)裝配
- byName:通過(guò)名字進(jìn)行自動(dòng)裝配
- byType:通過(guò)類型進(jìn)行自動(dòng)裝配
- constructor:通過(guò)構(gòu)造函數(shù)進(jìn)行自動(dòng)裝配
最開始我有寫到,在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>
Java類:
public class DefaultAutowireService { ByTypeDemo byTypeDemo; public ByTypeDemo getByTypeDemo() { return byTypeDemo; } public void setByTypeDemo(ByTypeDemo byTypeDemo) { this.byTypeDemo = byTypeDemo; } }
啟動(dòng)類:
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()); } }
控制臺(tái):
如果這時(shí)我們把xml文件中的default-autowire
去掉,重新啟動(dòng)程序并查看控制臺(tái):
紙上得來(lái)終覺淺,絕知此事要躬行!希望大家也可以自己寫寫代碼再驗(yàn)證一下!
總結(jié)
到此這篇關(guān)于你所不知道的Spring自動(dòng)注入詳解的文章就介紹到這了,更多相關(guān)Spring自動(dòng)注入內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
IDEA使用Tomcat運(yùn)行web項(xiàng)目教程分享
在非Spring Boot項(xiàng)目中運(yùn)行Nacos示例,需要手動(dòng)配置Tomcat容器,本文介紹了如何在IDEA中配置Tomcat,并詳細(xì)解決了配置過(guò)程中可能遇到的異常情況,步驟包括修改IDEA項(xiàng)目結(jié)構(gòu)、添加Web模塊、配置Artifacts和Tomcat Server2024-10-10SpringBoot和Vue2項(xiàng)目配置https協(xié)議過(guò)程
本文詳細(xì)介紹了SpringBoot項(xiàng)目和Vue2項(xiàng)目的部署流程及SSL證書配置,對(duì)于SpringBoot項(xiàng)目,需將.pfx文件放入resources目錄并配置server,然后打包部署,Vue2項(xiàng)目中,涉及檢查nginx的SSL模塊、編譯新的nginx文件2024-10-10Java同步關(guān)鍵字synchronize底層實(shí)現(xiàn)原理解析
synchronized關(guān)鍵字對(duì)大家來(lái)說(shuō)并不陌生,當(dāng)我們遇到并發(fā)情況時(shí),優(yōu)先會(huì)想到用synchronized關(guān)鍵字去解決,synchronized確實(shí)能夠幫助我們?nèi)ソ鉀Q并發(fā)的問(wèn)題,接下來(lái)通過(guò)本文給大家分享java synchronize底層實(shí)現(xiàn)原理,感興趣的朋友一起看看吧2021-08-08Spring事務(wù)注解@Transactional失效的八種場(chǎng)景分析
最近在開發(fā)采用Spring框架的項(xiàng)目中,使用了@Transactional注解,但發(fā)現(xiàn)事務(wù)注解失效了,所以這篇文章主要給大家介紹了關(guān)于Spring事務(wù)注解@Transactional失效的八種場(chǎng)景,需要的朋友可以參考下2021-05-05SpringCloud?Gateway詳細(xì)分析實(shí)現(xiàn)負(fù)載均衡與熔斷和限流
這篇文章主要介紹了SpringCloud?Gateway實(shí)現(xiàn)路由轉(zhuǎn)發(fā),負(fù)載均衡,熔斷和限流,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下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)試介紹及方案設(shè)計(jì)
為了解決 本地調(diào)試 的問(wèn)題,本文實(shí)現(xiàn)了一種簡(jiǎn)單實(shí)用的策略,可以通過(guò) Nacos 動(dòng)態(tài)配置服務(wù)路由,還可以基于用戶,部門,組織等級(jí)別配置服務(wù)路由,實(shí)現(xiàn) 本地調(diào)試 的同時(shí),實(shí)際上也實(shí)現(xiàn) 灰度發(fā)布,感興趣的朋友跟隨小編一起看看吧2021-07-07