1. 概述
在本快速教程中,我們將重點介紹 BeanNameAware 和 BeanFactoryAware 接口,在 Spring 框架中。
我們將分別描述每個接口的優缺點。
2. Aware 接口
Both BeanNameAware 和 BeanFactoryAware 屬於 org.springframework.beans.factory.Aware 根標記接口。它使用 setter 注入在應用程序上下文啓動期間獲取對象。
Aware 接口是回調、監聽器和觀察者設計模式的混合體。它表明該 Bean 具有通過回調方法被 Spring 容器通知的資格。
3. BeanNameAware
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();
}
}我們明確地為我們的 MyBeanName 類指定了名稱,這通過 AnnotationConfigApplicationContext context
= new AnnotationConfigApplicationContext(Config.class);
MyBeanName myBeanName = context.getBean(MyBeanName.class); 正如我們所預期的,setBeanName方法會打印出“myCustomBeanName”。 如果我們從@Bean註解中移除name = “…”代碼,那麼容器將會將getMyBeanName()方法名分配給該 Bean。因此,輸出將會是“getMyBeanName”。 BeanFactoryAware 用於注入 BeanFactory 對象。 這樣我們就可以訪問創建該對象的 BeanFactory。 以下是一個名為 MyBeanFactory 的類的示例: 藉助 setBeanFactory() 方法,我們為 beanFactory property 屬性賦值,將 BeanFactory 引用從 IoC 容器中傳遞過來。 之後,我們可以直接使用它,例如在 getMyBeanName() 函數中。 讓我們初始化 MyBeanFactory 並調用 getMyBeanName() 方法: 正如我們在之前的示例中已經實例化了 MyBeanName 類,Spring 將在此處調用已存在的實例。 該行 beanFactory.isSingleton(“myCustomBeanName”) 用於驗證。4. BeanFactoryAware
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"));
}
}MyBeanFactory myBeanFactory = context.getBean(MyBeanFactory.class);
myBeanFactory.getMyBeanName();5. 使用場景
BeanNameAware接口的典型使用場景是獲取 Bean 名稱,用於日誌記錄或依賴注入。對於BeanFactoryAware接口,則可以利用其能力從遺留代碼中獲取 Spring Bean。
在大多數情況下,我們應避免使用任何Aware接口,除非確實需要。Implementing these interfaces will couple the code to the Spring framework。
6. 結論
在本篇文檔中,我們學習了 BeanNameAware 和 BeanFactoryAware 接口及其在實踐中的使用方法。