Spring?Aware接口示例代碼詳解
若 Spring 檢測到 bean 實現(xiàn)了 Aware 接口,則會為其注入相應(yīng)的依賴。所以通過讓bean 實現(xiàn) Aware 接口,則能在 bean 中獲得相應(yīng)的 Spring 容器資源。
Spring 中提供的 Aware 接口有:
- BeanNameAware:注入當前 bean 對應(yīng) beanName
- BeanClassLoaderAware:注入加載當前 bean 的 ClassLoader
- BeanFactoryAware:注入 當前BeanFactory容器 的引用
BeanNameAware和BeanFactoryAware都屬于org.springframework.beans.factory.Aware根標記接口。
其使用setter注入來在應(yīng)用程序上下文啟動期間獲取對象。
Aware接口是回調(diào),監(jiān)聽器和觀察者設(shè)計模式的混合,它表示bean有資格通過回調(diào)方式被Spring容器通知。
1 BeanNameAware
使對象能夠知道容器中定義的bean名稱。
public class MyBeanName implements BeanNameAware { @Override public void setBeanName(String beanName) { System.out.println(beanName); } }
beanName屬性表示在Spring容器中注冊的bean id,在我們的實現(xiàn)中,只是顯示bean名稱。
在Spring配置類中注冊這種類型的bean:
@Configuration public class Config { @Bean(name = "myCustomBeanName") public MyBeanName getMyBeanName() { return new MyBeanName(); } }
啟動應(yīng)用程序上下文并從中獲取bean:
nnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Config.class); MyBeanName myBeanName = context.getBean(MyBeanName.class);
setBeanName方法打印出了“myCustomBeanName”。
若從@Bean注解中刪除name =“…”代碼,則在這種情況下,將getMyBeanName()方法名稱分配給bean,所以輸出將是“getMyBeanName”。
2 BeanFactoryAware
用于注入BeanFactory對象,就能訪問創(chuàng)建對象的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)在前面的示例中實例化了MyBeanName類,因此Spring將在此處調(diào)用現(xiàn)有實例。
3 適用場景
獲取bean名稱以進行日志記錄或埋點,對于BeanFactoryAware,它可以使用擴展代碼中的spring bean。
大多數(shù)情況下,應(yīng)避免使用任何Aware接口,因為實現(xiàn)這些接口會將代碼耦合到Spring框架。
到此這篇關(guān)于Spring Aware接口詳解的文章就介紹到這了,更多相關(guān)Spring Aware接口內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java利用LocalDate類實現(xiàn)日歷設(shè)計
java中做時間處理時一般會采用java.util.Date,但是相比于Date來說,還有更好的選擇--java.time.LocalDate。本文就來用LocalDate類實現(xiàn)日歷設(shè)計,感興趣的可以動手嘗試一下2022-07-07FasfDFS整合Java實現(xiàn)文件上傳下載功能實例詳解
這篇文章主要介紹了FasfDFS整合Java實現(xiàn)文件上傳下載功能實例詳解,需要的朋友可以參考下2017-08-08SpringBoot中利用AOP和攔截器實現(xiàn)自定義注解
本文將通過攔截器+AOP實現(xiàn)自定義注解,在這里攔截器充當在指定注解處要執(zhí)行的方法,aop負責將攔截器的方法和要注解生效的地方做一個織入,感興趣的可以嘗試一下2022-06-06