BeanNameAware和BeanFactoryAware

时间:2013-10-11 18:31:40

标签: java spring

BeanNameAwareBeanFactoryAware有什么用?我正在研究spring并遇到了这两个接口。 我用谷歌搜索了他们但没有任何用处。 请告诉我BeanNameAwareBeanFactoryAware接口的功能是什么以及何时使用这些接口?

4 个答案:

答案 0 :(得分:25)

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

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放入bean中即可绕过ApplicationContext接口。

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

    public void someMethod() {
        //I can use the ApplicationContext here.
    }
}

答案 1 :(得分:0)

BeanNameAware使对象知道其bean名称。它最好用于预注释配置弹簧(2.x)。您可以通过名称从定位器引用bean。
BeanFactoryAware为bean创建它的beanfactory提供访问权限。为了实现这一点,您应该查看文档:{​​{3}}

答案 2 :(得分:0)

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

另见http://docs.spring.io/spring/docs/3.0.x/spring-framework-reference/html/beans.html#beans-beanfactory作为参考。

答案 3 :(得分:0)

1)BeanFactoryAware 实现此接口的Bean可以访问创建它的BeanFactory
由于实现该接口的bean可以获取当前的bean工厂,因此可以用来从bean工厂调用任何服务。

2)BeanNameAware 实现此接口的Bean可以在Spring容器中定义其名称
一个可能的使用领域是,如果您在spring框架上构建/扩展该框架,并且想要获取Bean名称以进行日志记录/连接它们等。