javascript
Spring精华问答 | Spring Bean的自动装配是怎么回事?
戳藍(lán)字“CSDN云計算”關(guān)注我們哦!
Spring框架是由于軟件開發(fā)的復(fù)雜性而創(chuàng)建的。Spring使用的是基本的JavaBean來完成以前只可能由EJB完成的事情。然而,Spring的用途不僅僅限于服務(wù)器端的開發(fā)。從簡單性、可測試性和松耦合性角度而言,絕大部分Java應(yīng)用都可以從Spring中受益。今天,就讓我們來看看關(guān)于Spring更加有深度的問題吧。
1
? Q:如何向Spring Bean中注入一個Java.util.Properties?
A:第一種方法是使用如下面代碼所示的<props>?標(biāo)簽:也可用”util:”命名空間來從properties文件中創(chuàng)建出一個propertiesbean,然后利用setter方法注入bean的引用。
Q:Spring Bean的自動裝配是怎么回事?
A:在Spring框架中,在配置文件中設(shè)定bean的依賴關(guān)系是一個很好的機(jī)制,Spring容器還可以自動裝配合作關(guān)系bean之間的關(guān)聯(lián)關(guān)系。這意味著Spring可以通過向Bean Factory中注入的方式自動搞定bean之間的依賴關(guān)系。自動裝配可以設(shè)置在每個bean上,也可以設(shè)定在特定的bean上。
下面的XML配置文件表明了如何根據(jù)名稱將一個bean設(shè)置為自動裝配:
1 | <bean id="employeeDAO" class="com.howtodoinjava.EmployeeDAOImpl" autowire="byName" /> |
除了bean配置文件中提供的自動裝配模式,還可以使用@Autowired注解來自動裝配指定的bean。在使用@Autowired注解之前需要在按照如下的配置方式在Spring配置文件進(jìn)行配置才可以使用。
1 | <context:annotation-config /> |
也可以通過在配置文件中配置AutowiredAnnotationBeanPostProcessor?達(dá)到相同的效果。
1 | <bean class ="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/> |
配置好以后就可以使用@Autowired來標(biāo)注了。
1 2 3 4 | @Autowired public EmployeeDAOImpl ( EmployeeManager manager ) { ????this.manager = manager; } |
? ? ? ?Q:自動裝配模式有什么區(qū)別?
? ? ? ?A:在Spring框架中共有5種自動裝配,讓我們逐一分析。
no:這是Spring框架的默認(rèn)設(shè)置,在該設(shè)置下自動裝配是關(guān)閉的,開發(fā)者需要自行在bean定義中用標(biāo)簽明確的設(shè)置依賴關(guān)系。
byName:該選項可以根據(jù)bean名稱設(shè)置依賴關(guān)系。當(dāng)向一個bean中自動裝配一個屬性時,容器將根據(jù)bean的名稱自動在在配置文件中查詢一個匹配的bean。如果找到的話,就裝配這個屬性,如果沒找到的話就報錯。
byType:該選項可以根據(jù)bean類型設(shè)置依賴關(guān)系。當(dāng)向一個bean中自動裝配一個屬性時,容器將根據(jù)bean的類型自動在在配置文件中查詢一個匹配的bean。如果找到的話,就裝配這個屬性,如果沒找到的話就報錯。
constructor:造器的自動裝配和byType模式類似,但是僅僅適用于與有構(gòu)造器相同參數(shù)的bean,如果在容器中沒有找到與構(gòu)造器參數(shù)類型一致的bean,那么將會拋出異常。
autodetect:該模式自動探測使用構(gòu)造器自動裝配或者byType自動裝配。首先,首先會嘗試找合適的帶參數(shù)的構(gòu)造器,如果找到的話就是用構(gòu)造器自動裝配,如果在bean內(nèi)部沒有找到相應(yīng)的構(gòu)造器或者是無參構(gòu)造器,容器就會自動選擇byTpe的自動裝配方式。
Q:如何開啟基于注解的自動裝配?
A:要使用?@Autowired,需要注冊?AutowiredAnnotationBeanPostProcessor,可以有以下兩種方式來實現(xiàn):
1、引入配置文件中的<bean>下引入?<context:annotation-config>
1 2 3 | <beans> ????<context:annotation-config /> </beans> |
2、在bean配置文件中直接引入AutowiredAnnotationBeanPostProcessor
1 2 3 | <beans> ????<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/> </beans> |
??Q:請舉例解釋@Autowired注解?
A:@Autowired注解對自動裝配何時何處被實現(xiàn)提供了更多細(xì)粒度的控制。@Autowired注解可以像@Required注解、構(gòu)造器一樣被用于在bean的設(shè)值方法上自動裝配bean的屬性,一個參數(shù)或者帶有任意名稱或帶有多個參數(shù)的方法。
比如,可以在設(shè)值方法上使用@Autowired注解來替代配置文件中的?<property>元素。當(dāng)Spring容器在setter方法上找到@Autowired注解時,會嘗試用byType?自動裝配。
當(dāng)然我們也可以在構(gòu)造方法上使用@Autowired?注解。帶有@Autowired?注解的構(gòu)造方法意味著在創(chuàng)建一個bean時將會被自動裝配,即便在配置文件中使用<constructor-arg>?元素。
1 2 3 4 5 6 7 8 9 10 11 12 13 | public class TextEditor { ???private SpellChecker spellChecker; ? ???@Autowired ???public TextEditor(SpellChecker spellChecker){ ??????System.out.println("Inside TextEditor constructor." ); ??????this.spellChecker = spellChecker; ???} ? ???public void spellCheck(){ ??????spellChecker.checkSpelling(); ???} } |
下面是沒有構(gòu)造參數(shù)的配置方式:
1 2 3 4 5 6 7 8 9 10 11 12 13 | <beans> ? ???<context:annotation-config/> ? ???<!-- Definition for textEditor bean without constructor-arg? --> ???<bean id="textEditor" class="com.howtodoinjava.TextEditor"> ???</bean> ? ???<!-- Definition for spellChecker bean --> ???<bean id="spellChecker" class="com.howtodoinjava.SpellChecker"> ???</bean> ? </beans> |
小伙伴們沖鴨,后臺留言區(qū)等著你!
關(guān)于Spring,今天你學(xué)到了什么?還有哪些不懂的?除此還對哪些話題感興趣?快來留言區(qū)打卡啦!留言方式:打開第XX天,答:……
同時歡迎大家搜集更多問題,投稿給我們!風(fēng)里雨里留言區(qū)里等你~
福利
掃描添加小編微信,備注“姓名+公司職位”,加入【云計算學(xué)習(xí)交流群】,和志同道合的朋友們共同打卡學(xué)習(xí)!
推薦閱讀:
圖解分布式架構(gòu)的發(fā)展和演進(jìn) | 技術(shù)干貨
Docker 系列學(xué)習(xí)文章 | 什么是容器云?
任正非:華為海思芯片不是“備胎”!
揭秘清華 AI 學(xué)堂班:姚期智擔(dān)任首席教授,2019 年首批招收 30 人
Google Android 向華為“閉源”!華為手機(jī)迎來至暗時刻!
"兩年前我對區(qū)塊鏈的了解為零, 兩年后我成了工程師" 我是如何得到第一份工作的?
《使女的故事》大火,AI是背后最大推手?
真香,朕在看了! 創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎
總結(jié)
以上是生活随笔為你收集整理的Spring精华问答 | Spring Bean的自动装配是怎么回事?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 马云卸任,张勇宣布未来五年目标:消费规模
- 下一篇: gradle idea java ssm