日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無(wú)先后,達(dá)者為師

網(wǎng)站首頁(yè) 編程語(yǔ)言 正文

Spring Aware接口詳解

作者:JavaEdge. 更新時(shí)間: 2022-01-06 編程語(yǔ)言

若 Spring 檢測(cè)到 bean 實(shí)現(xiàn)了 Aware 接口,則會(huì)為其注入相應(yīng)的依賴。所以通過(guò)讓bean 實(shí)現(xiàn) Aware 接口,則能在 bean 中獲得相應(yīng)的 Spring 容器資源

Spring 中提供的 Aware 接口有:

  • BeanNameAware:注入當(dāng)前 bean 對(duì)應(yīng) beanName
  • BeanClassLoaderAware:注入加載當(dāng)前 bean 的 ClassLoader
  • BeanFactoryAware:注入 當(dāng)前BeanFactory容器 的引用

BeanNameAware和BeanFactoryAware都屬于org.springframework.beans.factory.Aware根標(biāo)記接口。

其使用setter注入來(lái)在應(yīng)用程序上下文啟動(dòng)期間獲取對(duì)象。

Aware接口是回調(diào),監(jiān)聽器和觀察者設(shè)計(jì)模式的混合,它表示bean有資格通過(guò)回調(diào)方式被Spring容器通知。

1 BeanNameAware

使對(duì)象能夠知道容器中定義的bean名稱。

public class MyBeanName implements BeanNameAware {
    @Override
    public void setBeanName(String beanName) {
        System.out.println(beanName);
    }
}

beanName屬性表示在Spring容器中注冊(cè)的bean id,在我們的實(shí)現(xiàn)中,只是顯示bean名稱。

在Spring配置類中注冊(cè)這種類型的bean:

@Configuration
public class Config {
    @Bean(name = "myCustomBeanName")
    public MyBeanName getMyBeanName() {
        return new MyBeanName();
    }
} 

啟動(dòng)應(yīng)用程序上下文并從中獲取bean:

AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Config.class);
MyBeanName myBeanName = context.getBean(MyBeanName.class); 

setBeanName方法打印出了“myCustomBeanName”。

若從@Bean注解中刪除name =“…”代碼,則在這種情況下,將getMyBeanName()方法名稱分配給bean,所以輸出將是“getMyBeanName”。

2 BeanFactoryAware

用于注入BeanFactory對(duì)象,就能訪問(wèn)創(chuàng)建對(duì)象的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)在前面的示例中實(shí)例化了MyBeanName類,因此Spring將在此處調(diào)用現(xiàn)有實(shí)例。

3 適用場(chǎng)景

獲取bean名稱以進(jìn)行日志記錄或埋點(diǎn),對(duì)于BeanFactoryAware,它可以使用擴(kuò)展代碼中的spring bean。

大多數(shù)情況下,應(yīng)避免使用任何Aware接口,因?yàn)閷?shí)現(xiàn)這些接口會(huì)將代碼耦合到Spring框架。

原文鏈接:https://blog.csdn.net/qq_33589510/article/details/122870732

欄目分類
最近更新