javascript
Spring学习(七)bean装配详解之 【通过注解装配 Bean】【自动装配的歧义解决】...
本文借鑒:Spring學(xué)習(xí),@Bean 的用法(特此感謝!)
自動(dòng)裝配
1、歧義性
我們知道用@Autowired可以對(duì)bean進(jìn)行注入(按照type注入),但如果有兩個(gè)相同類(lèi)型的bean在IOC容器中注冊(cè)了,要怎么去區(qū)分對(duì)哪一個(gè)Bean進(jìn)行注入呢?
如下情況,若用@Autowired的方式按類(lèi)型注入,IOC容器就不知道應(yīng)該注入哪個(gè)了:
<bean name="source1" class="pojo.Source"><property name="fruit" value="橙子"/><property name="sugar" value="多糖"/><property name="size" value="超大杯"/> </bean> <bean name="source2" class="pojo.Source"><property name="fruit" value="橙子"/><property name="sugar" value="少糖"/><property name="size" value="小杯"/> </bean>Spring對(duì)這種情況提供了2個(gè)注解進(jìn)行解決:
@Primary 注解
定義:代表首要的,當(dāng) Spring IoC 檢測(cè)到有多個(gè)相同類(lèi)型的 Bean 資源的時(shí)候,會(huì)優(yōu)先注入使用該注解的類(lèi)。
問(wèn)題:該注解只是解決了首要的問(wèn)題,但是并沒(méi)有選擇性的問(wèn)題。
@Qualifier 注解
定義:此注解可以讓Spring使用name的方式進(jìn)行Bean的裝配以及注入
/* 包名和import */ public class JuiceMaker {......@Autowired@Qualifier("source1")//指定注入名稱(chēng)為 "source1" 的 Bean 資源public void setSource(Source source) {this.source = source;} }2、使用@Bean 裝配 Bean
基礎(chǔ)用法
定義:@Bean是一個(gè)方法級(jí)別上的注解,主要用在@Configuration注解的類(lèi)里,也可以用在@Component注解的類(lèi)里。
用法:標(biāo)識(shí)這個(gè)方法可以產(chǎn)生一個(gè)Bean并且交給Spring容器管理,告訴Spring可以在這個(gè)方法中拿到一個(gè)Bean。
PS:添加的bean的id為方法名
@Configuration public class AppConfig {@Bean//用@Bean注解配置Bean時(shí),bean的ID默認(rèn)為方法的名稱(chēng)public TransferService transferService() {return new TransferServiceImpl();}}上面的代碼等同于
<beans><bean id="transferService" class="com.acme.TransferServiceImpl"/> </beans>bean的依賴(lài)
@bean 也可以依賴(lài)其他任意數(shù)量的bean,如果TransferService 依賴(lài) AccountRepository,我們可以通過(guò)方法參數(shù)實(shí)現(xiàn)這個(gè)依賴(lài)。
@Configuration public class AppConfig {@Beanpublic TransferService transferService(AccountRepository accountRepository) {//PS:此方法的入?yún)⒕褪欠祷刂邓蕾?lài)的對(duì)象return new TransferServiceImpl(accountRepository);}}3、Bean的作用域
可以通過(guò) @Scope 注解或者 <bean> 元素中的 scope 屬性來(lái)設(shè)置Bean的作用域
4、Spring 表達(dá)式
一個(gè)例子簡(jiǎn)單了解下:?
package pojo;import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component;@Component("elBean") public class ElBean {// 通過(guò) beanName 獲取 bean,然后注入role這個(gè)對(duì)象@Value("#{role}")private Role role;// 獲取 bean 的屬性 id,并注入給id這個(gè)變量@Value("#{role.id}")private Long id;// 調(diào)用 bean 的 getNote 方法,并注入給note這個(gè)變量@Value("#{role.getNote().toString()}")private String note;/* getter and setter */ }小結(jié):?
@Value("#{}") 表示SpEl表達(dá)式,通常用來(lái)獲取bean的屬性,或者調(diào)用bean的某個(gè)方法,或者常量注入。
PS:簡(jiǎn)要的說(shuō),就是通過(guò)@Value這個(gè)注解注入對(duì)象或者屬性給相應(yīng)的變量(簡(jiǎn)單的理解為賦值操作)。
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/riches/p/11526413.html
總結(jié)
以上是生活随笔為你收集整理的Spring学习(七)bean装配详解之 【通过注解装配 Bean】【自动装配的歧义解决】...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Node.Js同步mongdb数据
- 下一篇: gradle idea java ssm