Spring多對象引入方法
在以前使用xml配置注入的時(shí)候, 可以通過name名稱注入, 也可以使用type類型注入.
在SpringBoot中, 可以使用@Resource和@Autowried注解進(jìn)行注入.
@Resource 默認(rèn)會(huì)使用名稱進(jìn)行注入, 如果找不到, 會(huì)使用自動(dòng)使用類型進(jìn)行注入.
@Autowried, 則會(huì)在容器中尋找匹配的對象, 如果找到則注入成功, 如果沒找到或者找到多個(gè), 則會(huì)報(bào)錯(cuò).
但是, 如果有多個(gè)的情況下, 可以使用@Qualifier("別名") 進(jìn)行約束.
1.創(chuàng)建Bean
1.1如果使用方法bean注入對象, 給@Bean添加name值.
@Bean(name="別名")
代碼樣例:
注意
下面的@Bean(name = "test01DataSource"), 可以使用applicationContext.getBean("test01DataSource") 進(jìn)行獲取.
@Primary表示 如果以type類型進(jìn)行選擇的話, 首選該Bean.
也即是說,使用applicationContext.getBean(DataSource.class) 和applicationContext.getBean("test01DataSource") 獲取到的是同一個(gè)對象.
源碼:
@Configuration
public class DataSourceConfig {
@Bean(name = "test01DataSource")
@Primary
@ConfigurationProperties(prefix = "spring.datasource.test01")
public DataSource getTest01DataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "test02DataSource")
@ConfigurationProperties(prefix = "spring.datasource.test02")
public DataSource test02DataSource() {
return DataSourceBuilder.create().build();
}
}
測試代碼:
@Autowired
ApplicationContext applicationContext;
@Test
public void testDataSourceHashCode() {
System.out.println(applicationContext.getBean(DataSource.class).hashCode());
System.out.println((applicationContext.getBean("test01DataSource")).hashCode());
System.out.println((applicationContext.getBean("test02DataSource")).hashCode());
}
結(jié)果樣例:
1105282397
1105282397
793657559
1.2使用類注解進(jìn)行注入對象. @Service, @Component,添加value值進(jìn)行創(chuàng)建別名.
// 創(chuàng)建接口
public interface IBeanService {
public void printInfo();
}
//創(chuàng)建實(shí)例01, 并且添加上@Primary注解, 表名默認(rèn)使用這個(gè)類
@Service(value = "bean01")
@Primary
public class Bean01Service implements IBeanService {
@Override
public void printInfo() {
System.out.println("This is bean 01");
}
}
//創(chuàng)建實(shí)例02,
@Service(value = "bean02")
public class Bean02Service implements IBeanService {
@Override
public void printInfo() {
System.out.println("This is bean 02");
}
}
@RunWith(SpringRunner.class)
@SpringBootTest
public class IBeanServiceTest {
@Autowired
ApplicationContext applicationContext;
// create default bean.
@Autowired
IBeanService beanService;
@Autowired
@Qualifier("bean01")
IBeanService bean01Service;
@Autowired
@Qualifier("bean02")
IBeanService bean02Service;
@Test
public void printInfo() {
// create bean01
IBeanService bean01 = (IBeanService) applicationContext.getBean("bean01");
// create bean02
IBeanService bean02 = (IBeanService) applicationContext.getBean("bean02");
bean01.printInfo();
bean02.printInfo();
// create default bean, and it is bean01
applicationContext.getBean(IBeanService.class).printInfo();
}
@Test
public void printInfoThroughAutowired() {
beanService.printInfo();
bean01Service.printInfo();
bean02Service.printInfo();
}
}
2.調(diào)用
2.1.如果需要?jiǎng)?chuàng)建局部變量, 使用applicationContext.getBean(class/name)創(chuàng)建
對于有@Primary的對象, 直接使用getBean(class)進(jìn)行調(diào)用.
applicationContext.getBean(IBeanService.class)
對于其他的Bean, 使用getBean(name)進(jìn)行調(diào)用, 并進(jìn)行類型強(qiáng)制轉(zhuǎn)換.
eg. (IBeanService) applicationContext.getBean("bean02");
2.2.如果需要?jiǎng)?chuàng)建成員變量, 使用@Autowired和 @Qualifier("別名") 進(jìn)行
對于有@Primary的對象, 直接使用@Autowired進(jìn)行調(diào)用.代碼如下
@Autowired IBeanService beanService;
對于其他的bean, 通過添加@Qualifier("別名")進(jìn)行調(diào)用, 代碼如下
@Autowired
@Qualifier("bean02")
IBeanService bean02Service;
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請查看下面相關(guān)鏈接
- SpringBoot之Java配置的實(shí)現(xiàn)
- Spring Boot集成Java DSL的實(shí)現(xiàn)代碼
- 詳解java中spring里的三大攔截器
- 淺談Java中Spring Boot的優(yōu)勢
- java Springboot實(shí)現(xiàn)多文件上傳功能
- JavaTCP上傳文本文件代碼
- Java五子棋AI實(shí)現(xiàn)代碼
- Spring Cloud原理詳解
- SpringBoot中關(guān)于static和templates的注意事項(xiàng)以及webjars的配置
- Spring相關(guān)知識(shí)點(diǎn)的總結(jié)與梳理
相關(guān)文章
SpringBoot整合Drools的實(shí)現(xiàn)步驟
Drools是一個(gè)易于訪問企業(yè)策略、易于調(diào)整以及易于管理的開源業(yè)務(wù)規(guī)則引擎,符合業(yè)內(nèi)標(biāo)準(zhǔn),速度快、效率高。業(yè)務(wù)分析師或?qū)徍巳藛T可以利用它輕松查看業(yè)務(wù)規(guī)則,從而檢驗(yàn)是否已編碼的規(guī)則執(zhí)行所需的業(yè)務(wù)規(guī)則。本文將講述SpringBoot整合Drools的步驟2021-05-05
Java 線程池詳解及創(chuàng)建簡單實(shí)例
這篇文章主要介紹了Java 線程池詳解及創(chuàng)建簡單實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-02-02
Java map.getOrDefault()方法的用法詳解
這篇文章主要介紹了Java map.getOrDefault()方法的用法詳解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12
Java 可視化垃圾回收_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
Ben Evans是一名資深培訓(xùn)師兼顧問,他在演講可視化垃圾回收中從基礎(chǔ)談起討論了垃圾回收。以下是對其演講的簡短總結(jié)。感興趣的朋友一起學(xué)習(xí)吧2017-05-05

