知識庫 / Spring RSS 訂閱

Spring 中的 BeanNameAware 和 BeanFactoryAware 接口

Spring
HongKong
3
02:03 PM · Dec 06 ,2025

1. 概述

在本快速教程中,我們將重點介紹 BeanNameAwareBeanFactoryAware 接口,在 Spring 框架中。

我們將分別描述每個接口的優缺點。

2. Aware 接口

Both BeanNameAwareBeanFactoryAware 屬於 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”

4. BeanFactoryAware

BeanFactoryAware 用於注入 BeanFactory 對象。 這樣我們就可以訪問創建該對象的 BeanFactory

以下是一個名為 MyBeanFactory 的類的示例:

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() 方法,我們為 beanFactory property 屬性賦值,將 BeanFactory 引用從 IoC 容器中傳遞過來。

之後,我們可以直接使用它,例如在 getMyBeanName() 函數中。

讓我們初始化 MyBeanFactory 並調用 getMyBeanName() 方法:

MyBeanFactory myBeanFactory = context.getBean(MyBeanFactory.class);
myBeanFactory.getMyBeanName();

正如我們在之前的示例中已經實例化了 MyBeanName 類,Spring 將在此處調用已存在的實例。

該行 beanFactory.isSingleton(“myCustomBeanName”) 用於驗證。

5. 使用場景BeanNameAware接口的典型使用場景是獲取 Bean 名稱,用於日誌記錄或依賴注入。對於BeanFactoryAware接口,則可以利用其能力從遺留代碼中獲取 Spring Bean。

在大多數情況下,我們應避免使用任何Aware接口,除非確實需要。Implementing these interfaces will couple the code to the Spring framework

6. 結論

在本篇文檔中,我們學習了 BeanNameAwareBeanFactoryAware 接口及其在實踐中的使用方法。

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.