網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
若 Spring 檢測(cè)到 bean 實(shí)現(xiàn)了 Aware 接口,則會(huì)為其注入相應(yīng)的依賴。所以通過(guò)讓bean 實(shí)現(xiàn) Aware 接口,則能在 bean 中獲得相應(yīng)的 Spring 容器資源。
Spring 中提供的 Aware 接口有:
- BeanNameAware:注入當(dāng)前 bean 對(duì)應(yīng) beanName
- BeanClassLoaderAware:注入加載當(dāng)前 bean 的 ClassLoader
- BeanFactoryAware:注入 當(dāng)前BeanFactory容器 的引用
BeanNameAware和BeanFactoryAware都屬于org.springframework.beans.factory.Aware根標(biāo)記接口。
其使用setter注入來(lái)在應(yīng)用程序上下文啟動(dòng)期間獲取對(duì)象。
Aware接口是回調(diào),監(jiān)聽器和觀察者設(shè)計(jì)模式的混合,它表示bean有資格通過(guò)回調(diào)方式被Spring容器通知。
1 BeanNameAware
使對(duì)象能夠知道容器中定義的bean名稱。
public class MyBeanName implements BeanNameAware {
@Override
public void setBeanName(String beanName) {
System.out.println(beanName);
}
}
beanName屬性表示在Spring容器中注冊(cè)的bean id,在我們的實(shí)現(xiàn)中,只是顯示bean名稱。
在Spring配置類中注冊(cè)這種類型的bean:
@Configuration
public class Config {
@Bean(name = "myCustomBeanName")
public MyBeanName getMyBeanName() {
return new MyBeanName();
}
}
啟動(dòng)應(yīng)用程序上下文并從中獲取bean:
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Config.class);
MyBeanName myBeanName = context.getBean(MyBeanName.class);
setBeanName方法打印出了“myCustomBeanName”。
若從@Bean注解中刪除name =“…”代碼,則在這種情況下,將getMyBeanName()方法名稱分配給bean,所以輸出將是“getMyBeanName”。
2 BeanFactoryAware
用于注入BeanFactory對(duì)象,就能訪問(wèn)創(chuàng)建對(duì)象的BeanFactory。
public class MyBeanFactory implements BeanFactoryAware {
private BeanFactory beanFactory;
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
this.beanFactory = beanFactory;
}
public void getMyBeanName() {
MyBeanName myBeanName = beanFactory.getBean(MyBeanName.class);
System.out.println(beanFactory.isSingleton("myCustomBeanName"));
}
}
在setBeanFactory()方法的幫助下,我們將IoC容器中的BeanFactory引用分配給beanFactory屬性。
然后,我們可以像在getMyBeanName()函數(shù)中一樣直接使用它。
初始化MyBeanFactory并調(diào)用getMyBeanName()方法:
MyBeanFactory myBeanFactory = context.getBean(MyBeanFactory.class);
myBeanFactory.getMyBeanName();
由于我們已經(jīng)在前面的示例中實(shí)例化了MyBeanName類,因此Spring將在此處調(diào)用現(xiàn)有實(shí)例。
3 適用場(chǎng)景
獲取bean名稱以進(jìn)行日志記錄或埋點(diǎn),對(duì)于BeanFactoryAware,它可以使用擴(kuò)展代碼中的spring bean。
大多數(shù)情況下,應(yīng)避免使用任何Aware接口,因?yàn)閷?shí)現(xiàn)這些接口會(huì)將代碼耦合到Spring框架。
原文鏈接:https://blog.csdn.net/qq_33589510/article/details/122870732
相關(guān)推薦
- 2022-07-21 Kafka3.0 消費(fèi)者事務(wù)與數(shù)據(jù)積壓
- 2022-09-06 python?numpy中array與pandas的DataFrame轉(zhuǎn)換方式_python
- 2022-11-10 在React項(xiàng)目中使用TypeScript詳情_React
- 2022-03-13 .Net6開發(fā)winform程序使用依賴注入_C#教程
- 2022-12-24 Go中函數(shù)的使用細(xì)節(jié)與注意事項(xiàng)詳解_Golang
- 2022-12-14 C++雙線程調(diào)用網(wǎng)絡(luò)攝像頭與多線程調(diào)用多攝像頭同步執(zhí)行方法詳細(xì)講解_C 語(yǔ)言
- 2022-09-24 python的numpy模塊實(shí)現(xiàn)邏輯回歸模型_python
- 2022-10-14 Sklearn中predict_proba函數(shù)用法及原理詳解
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支