天天看點

Spring之BeanNameAware和BeanFactoryAware接口

Spring之BeanNameAware和BeanFactoryAware接口

點選「藍色微信名」可快速關注

1

概述

在本篇文章中,我們将重點關注Spring架構中的BeanNameAware和BeanFactoryAware接口。

我們将分别描述每個接口的使用優缺點。

2

Aware接口

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();

}

}

這裡我們使用@Bean(name =“myCustomBeanName”注解為我們的MyBeanName類明确指定了一個名稱。

現在我們可以啟動應用程式上下文并從中擷取bean:

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()方法的幫助下,我們将IoC容器中的BeanFactory引用配置設定給beanFactory屬性。

然後,我們可以像在getMyBeanName()函數中一樣直接使用它。

初始化MyBeanFactory并調用getMyBeanName()方法:

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

myBeanFactory.getMyBeanName();

由于我們已經在前面的示例中執行個體化了MyBeanName類,是以Spring将在此處調用現有執行個體。

5

何時使用?

BeanNameAware的典型用例可能是擷取bean名稱以進行日志記錄或埋點,對于BeanFactoryAware,它可以使用擴充代碼中的spring bean。

在大多數情況下,我們應該避免使用任何Aware接口,除非我們需要它們,實作這些接口會将代碼耦合到Spring架構。

總結

在這篇文章中,我們了解了BeanNameAware和BeanFactoryAware接口以及如何在實踐中使用它們。