網站首頁 編程語言 正文
若 Spring 檢測到 bean 實現了 Aware 接口,則會為其注入相應的依賴。所以通過讓bean 實現 Aware 接口,則能在 bean 中獲得相應的 Spring 容器資源。
Spring 中提供的 Aware 接口有:
- BeanNameAware:注入當前 bean 對應 beanName
- BeanClassLoaderAware:注入加載當前 bean 的 ClassLoader
- BeanFactoryAware:注入 當前BeanFactory容器 的引用
BeanNameAware和BeanFactoryAware都屬于org.springframework.beans.factory.Aware根標記接口。
其使用setter注入來在應用程序上下文啟動期間獲取對象。
Aware接口是回調,監聽器和觀察者設計模式的混合,它表示bean有資格通過回調方式被Spring容器通知。
1 BeanNameAware
使對象能夠知道容器中定義的bean名稱。
public class MyBeanName implements BeanNameAware {
@Override
public void setBeanName(String beanName) {
System.out.println(beanName);
}
}
beanName屬性表示在Spring容器中注冊的bean id,在我們的實現中,只是顯示bean名稱。
在Spring配置類中注冊這種類型的bean:
@Configuration
public class Config {
@Bean(name = "myCustomBeanName")
public MyBeanName getMyBeanName() {
return new MyBeanName();
}
}
啟動應用程序上下文并從中獲取bean:
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Config.class);
MyBeanName myBeanName = context.getBean(MyBeanName.class);
setBeanName方法打印出了“myCustomBeanName”。
若從@Bean注解中刪除name =“…”代碼,則在這種情況下,將getMyBeanName()方法名稱分配給bean,所以輸出將是“getMyBeanName”。
2 BeanFactoryAware
用于注入BeanFactory對象,就能訪問創建對象的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()函數中一樣直接使用它。
初始化MyBeanFactory并調用getMyBeanName()方法:
MyBeanFactory myBeanFactory = context.getBean(MyBeanFactory.class);
myBeanFactory.getMyBeanName();
由于我們已經在前面的示例中實例化了MyBeanName類,因此Spring將在此處調用現有實例。
3 適用場景
獲取bean名稱以進行日志記錄或埋點,對于BeanFactoryAware,它可以使用擴展代碼中的spring bean。
大多數情況下,應避免使用任何Aware接口,因為實現這些接口會將代碼耦合到Spring框架。
原文鏈接:https://blog.csdn.net/qq_33589510/article/details/122870732
相關推薦
- 2023-06-21 python相對包導入報“Attempted?relative?import?in?non-pack
- 2022-11-03 C#事件中的兩個參數詳解(object?sender,EventArgs?e)_C#教程
- 2022-12-03 Sql?Server中通過sql命令獲取cpu占用及產生鎖的sql_MsSql
- 2022-12-16 Python中選擇結構實例講解_python
- 2022-12-08 C#調用C++?DLL?bool返回值始終為true的問題_C#教程
- 2022-05-12 Python中賦值運算符的含義與使用方法_python
- 2022-08-15 Android?Gradle模塊依賴替換使用技巧_Android
- 2022-06-16 詳解Flutter中網絡框架dio的二次封裝_Android
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支