Spring的自動(dòng)裝配常用注解詳解
Spring的自動(dòng)裝配
自動(dòng)裝配就是指 Spring 容器在不使用 <constructor-arg> 和<property> 標(biāo)簽的情況下,可以自動(dòng)裝配(autowire)相互協(xié)作的 Bean 之間的關(guān)聯(lián)關(guān)系,將一個(gè) Bean 注入其他 Bean 的 Property 中。
使用自動(dòng)裝配需要配置 <bean> 元素的 autowire 屬性。
autowire 屬性有五個(gè)值,具體說(shuō)明如下表所示:
| 名稱(chēng) | 說(shuō)明 |
| no | 默認(rèn)值,表示不使用自動(dòng)裝配,Bean 依賴(lài)必須通過(guò) ref 元素定義。 |
| byName | 根據(jù) Property 的 name 自動(dòng)裝配,如果一個(gè) Bean 的 name 和另一個(gè) Bean 中的 Property 的 name 相同,則自動(dòng)裝配這個(gè) Bean 到 Property 中。(表示按屬性名稱(chēng)自動(dòng)裝配,XML 文件中 Bean 的 id 必須與類(lèi)中的屬性名稱(chēng)相同) |
| byType | 根據(jù) Property 的數(shù)據(jù)類(lèi)型(Type)自動(dòng)裝配,如果一個(gè) Bean 的數(shù)據(jù)類(lèi)型兼容另一個(gè) Bean 中 Property 的數(shù)據(jù)類(lèi)型,則自動(dòng)裝配。(XML 文件中 Bean 的 id 與類(lèi)中的屬性名稱(chēng)可以不同,但必須只有一個(gè)類(lèi)型的 Bean。) |
| constructor | 類(lèi)似于 byType,根據(jù)構(gòu)造方法參數(shù)的數(shù)據(jù)類(lèi)型,進(jìn)行 byType 模式的自動(dòng)裝配。(類(lèi)中構(gòu)造函數(shù)的參數(shù)必須在配置文件中有相同的類(lèi)型) |
| autodetect(3.0版本不支持) | 如果 Bean 中有默認(rèn)的構(gòu)造方法,則用 constructor 模式,否則用 byType 模式。 |
自動(dòng)裝配的優(yōu)缺點(diǎn)
優(yōu)點(diǎn)
- 自動(dòng)裝配只需要較少的代碼就可以實(shí)現(xiàn)依賴(lài)注入。
缺點(diǎn)
- 不能自動(dòng)裝配簡(jiǎn)單數(shù)據(jù)類(lèi)型,比如 int、boolean、String 等。
- 相比較顯示裝配,自動(dòng)裝配不受程序員控制。
Spring基于注解裝配Bean(常用注解)
Spring 默認(rèn)不使用注解裝配 Bean,因此需要在配置文件中添加 <context:annotation-config/> ,啟用注解。
或者在被子文件中配置
<context:component-scan base-package="需要使用注解的包"></context:component-scan>
常用注解注入值:
@Component:用來(lái)描述Spring中的Bean,僅僅表示一個(gè)組件(Bean),并且可以作用在任何層次,使用時(shí)只需要將該注解標(biāo)注在相應(yīng)類(lèi)上即可。
@Controller:通常作用在控制層(如 Struts2 的 Action、SpringMVC 的 Controller),用于將控制層的類(lèi)標(biāo)識(shí)為 Spring 中的 Bean,其功能與 @Component 相同。
@Service:通常作用在業(yè)務(wù)層(Service 層),用于將業(yè)務(wù)層的類(lèi)標(biāo)識(shí)為 Spring 中的 Bean,其功能與 @Component 相同。
@Repository:用于將數(shù)據(jù)訪(fǎng)問(wèn)層(DAO層)的類(lèi)標(biāo)識(shí)為Spring中的Bean,其功能與@Component相同
@Autowired:可以應(yīng)用到 Bean 的屬性變量、屬性的 setter 方法、非 setter 方法及構(gòu)造函數(shù)等,配合對(duì)應(yīng)的注解處理器完成 Bean 的自動(dòng)配置工作。默認(rèn)按照 Bean 的類(lèi)型進(jìn)行裝配。只要容器中有唯一的一個(gè)bean對(duì)象類(lèi)型和要注入的變量類(lèi)型匹配,就可以注入成功,如果ioc容器中沒(méi)有任何bean類(lèi)型和要注入的變量類(lèi)型匹配則報(bào)錯(cuò)
@Qualifier:與 @Autowired 注解配合使用,會(huì)將默認(rèn)的按 Bean 類(lèi)型裝配修改為按 Bean 的實(shí)例名稱(chēng)裝配,Bean 的實(shí)例名稱(chēng)由 @Qualifier 注解的參數(shù)指定。它在給類(lèi)成員注入時(shí)不能單獨(dú)使用必須要和@Autowired,但是在給方法參數(shù)注入時(shí)可以單獨(dú)使用。
@Resource:作用于@Autowired相同,區(qū)別在于@Resource可以通過(guò)Bean實(shí)例名稱(chēng)進(jìn)行裝配,也就是@Resource中的兩個(gè)重要屬性name和type。
@Value:用于注入基本類(lèi)型和String類(lèi)型的值用于指定數(shù)據(jù)的值,它可以使用spring中SpEL;
@ConfigurationProperties:用于注入一些值。請(qǐng)注意以下幾點(diǎn):
- 前綴定義了哪些外部屬性將綁定到類(lèi)的字段上
- 根據(jù) Spring Boot 寬松的綁定規(guī)則,類(lèi)的屬性名稱(chēng)必須與外部屬性的名稱(chēng)匹配
- 我們可以簡(jiǎn)單地用一個(gè)值初始化一個(gè)字段來(lái)定義一個(gè)默認(rèn)值
- 類(lèi)本身可以是包私有的
- 類(lèi)的字段必須有公共 setter 方法
@Value和@ConfigurationProperties區(qū)別
| 區(qū)別 | @ConfigurationProperties | @Value |
| 功能 | 批量注入配置文件中的屬性 | 一個(gè)個(gè)指定 |
| 松散綁定(松散語(yǔ)法) | 支持 | 不支持 |
| SpEL | 不支持 | 支持 |
| JSR303數(shù)據(jù)校驗(yàn) | 支持 | 不支持 |
| 復(fù)雜類(lèi)型封裝 | 支持 | 不支持 |
@Configuration:標(biāo)注在類(lèi)上,配置spring容器(應(yīng)用上下文)。相當(dāng)于把該類(lèi)作為spring的xml配置文件中的 <beans> ,在使用該注解的類(lèi)中,使用@Bean注解標(biāo)注的方法,返回的類(lèi)型都會(huì)直接注冊(cè)為bean。其底層實(shí)現(xiàn)使用了@Component 。
@Bean:用于告訴方法,產(chǎn)生一個(gè)Bean對(duì)象,然后這個(gè)Bean對(duì)象交給Spring管理。產(chǎn)生這個(gè)Bean對(duì)象的方法Spring只會(huì)調(diào)用一次,隨后這個(gè)Spring將會(huì)將這個(gè)Bean對(duì)象放在自己的IOC容器中。
改變作用域的常用注解:
@Lazy(true):表明一個(gè)bean 是否延遲加載,可以作用在方法上,表示這個(gè)方法被延遲加載;可以作用在@Component (或者由@Component 作為原注解) 注釋的類(lèi)上,表明這個(gè)類(lèi)中所有的bean 都被延遲加載。如果沒(méi)有@Lazy注釋?zhuān)蛘這Lazy 被設(shè)置為false,那么該bean 就會(huì)急切渴望被加載;除了上面兩種作用域,@Lazy 還可以作用在@Autowired和@Inject注釋的屬性上,在這種情況下,它將為該字段創(chuàng)建一個(gè)惰性代理,作為使用ObjectFactory或Provider的默認(rèn)方法
@Scope:用來(lái)給Bean改變作用域,使用時(shí)直接在Bean上加@Scope(value = "xxx"),默認(rèn)值為singleton。
和生命周期相關(guān)常用注解:
@PostConstruct:該注解被用來(lái)修飾一個(gè)非靜態(tài)的void()方法。被@PostConstruct修飾的方法會(huì)在服務(wù)器加載Servlet的時(shí)候運(yùn)行,并且只會(huì)被服務(wù)器執(zhí)行一次。PostConstruct在構(gòu)造函數(shù)之后執(zhí)行,init()方法之前執(zhí)行。通常我們會(huì)是在Spring框架中使用到@PostConstruct注解 該注解的方法在整個(gè)Bean初始化中的執(zhí)行順序:Constructor(構(gòu)造方法) -> @Autowired(依賴(lài)注入) -> @PostConstruct(注釋的方法)
@PreDestory:@PreDestory修飾的方法會(huì)在服務(wù)器卸載Servlet的時(shí)候運(yùn)行,并且之后被服務(wù)器調(diào)用一次,類(lèi)似于Servlet中的destory()方法,雖然PreDestory字面意思是在destory之前運(yùn)行,但是被@PreDestory修飾的方法會(huì)在destory方法運(yùn)行之后運(yùn)行,在Servlet被徹底卸載之前,PreDestory里的Destory指的是Servlet的銷(xiāo)毀,而不是destory()方法。
到此這篇關(guān)于Spring的自動(dòng)裝配常用注解詳解的文章就介紹到這了,更多相關(guān)Spring自動(dòng)裝配注解內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring MVC 攔截器 interceptor 用法詳解
這篇文章主要介紹了Spring MVC 攔截器 interceptor 用法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
深度剖析java動(dòng)態(tài)靜態(tài)代理原理源碼
這篇文章主要介紹了深度剖析java動(dòng)態(tài)靜態(tài)代理原理源碼,關(guān)于Java中的動(dòng)態(tài)代理,我們首先需要了解的是一種常用的設(shè)計(jì)模式--代理模式,而對(duì)于代理,根據(jù)創(chuàng)建代理類(lèi)的時(shí)間點(diǎn),又可以分為靜態(tài)代理和動(dòng)態(tài)代理。,需要的朋友可以參考下2019-06-06
java實(shí)現(xiàn)String字符串處理各種類(lèi)型轉(zhuǎn)換
在日常的程序開(kāi)發(fā)中,經(jīng)常會(huì)涉及到不同類(lèi)型之間的轉(zhuǎn)換,本文主要介紹了String字符串處理各種類(lèi)型轉(zhuǎn)換,具有一定的參考價(jià)值,感興趣的可以了解一下2023-10-10
jar包運(yùn)行時(shí)提示jar中沒(méi)有主清單屬性的解決
這篇文章主要介紹了jar包運(yùn)行時(shí)提示jar中沒(méi)有主清單屬性的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02

