20

What is the use of BeanNameAware and BeanFactoryAware? I was studying spring and came across these two interfaces. I googled them but nothing useful came up. Please tell me what is the functionality of BeanNameAware and BeanFactoryAware interfaces and when to use these?

4

4 回答 4

28

xxxAware接口是 Spring 框架中使用的一种常见模式。它们通常用于允许setXxx在 Spring 引导时为 Spring 托管 bean 提供一个对象(通过接口方法)。

Springs 文档对Aware接口进行了说明,这是您提到的两个接口的超级接口:

标记超接口,指示 bean 有资格通过回调样式方法由特定框架对象的 Spring 容器通知。

正如 Sotirious 所指出的,Aware界面具有侦听器、回调或观察者设计模式的感觉。

用法如下所示:

@Component
public MyBean implements BeanFactoryAware {
    private BeanFactory beanFactory;

    @Override
    public void setBeanFactory(final BeanFactory beanFactory) {
        this.beanFactory = beanFactory;
    }

    public void myMethod() {
        //I can now use beanFactory here
    }
}

在引导期间,Spring 将检查每个 bean 以确定它是否实现了任何xxxAware接口。当找到一个时,它调用接口方法,提供所要求的信息。在上面的例子中,Spring 调用MyBean#setBeanFactory提供它的BeanFactory.

当然,在很多情况下,并不完全需要使用这些接口。例如,ApplicationContextAware可以通过简单地@Autowired将 anApplicationContext放入 bean 来绕过接口。

@Component
public class MyOtherBean {
    @Autowired
    private ApplicationContext applicationContext;

    public void someMethod() {
        //I can use the ApplicationContext here.
    }
}
于 2013-10-11T18:40:08.423 回答
0

BeanFactoryAware 接口在 ApplicationContext 的初始化期间使用。它已在 Spring 2 中用于在初始化 bean 之前自定义它们的编织。一个示例是为了在加载时(LTW)额外添加切入点,例如用于自动生成的 DAO 查找方法。另一种用法可能是加载最小化的测试上下文,以加快测试速度(延迟初始化会是更好的做法)

另请参阅http://docs.spring.io/spring/docs/3.0.x/spring-framework-reference/html/beans.html#beans-beanfactory以获取参考。

于 2013-10-11T18:53:28.450 回答
0

BeanNameAware 使对象知道它的 bean 名称。最好在 pre annotation config spring (2.x) 中使用。然后,您可以通过名称从定位器中引用 bean。
BeanFactoryAware 使 bean 可以访问创建它的 beanfactory。为了有用,您应该查看文档:http ://docs.spring.io/spring/docs/2.5.x/api/org/springframework/beans/factory/BeanFactoryAware.html

于 2013-10-11T18:44:09.193 回答
0

1)BeanFactoryAware 实现该接口的bean 可以获得对BeanFactory创建它的访问权限
因为实现该接口的bean 可以获得当前的bean factory,这可以用来调用bean factory 中的任何服务。

2)BeanNameAware 实现此接口的 Bean 可以在 Spring 容器中定义其名称
一个可能的使用领域可能是您构建/扩展 Spring 框架并希望获取 bean 名称以用于记录/连接它们等。

于 2018-11-06T06:32:16.703 回答