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 回答
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.
}
}
BeanFactoryAware 接口在 ApplicationContext 的初始化期间使用。它已在 Spring 2 中用于在初始化 bean 之前自定义它们的编织。一个示例是为了在加载时(LTW)额外添加切入点,例如用于自动生成的 DAO 查找方法。另一种用法可能是加载最小化的测试上下文,以加快测试速度(延迟初始化会是更好的做法)
另请参阅http://docs.spring.io/spring/docs/3.0.x/spring-framework-reference/html/beans.html#beans-beanfactory以获取参考。
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
1)BeanFactoryAware
实现该接口的bean 可以获得对BeanFactory
创建它的访问权限
因为实现该接口的bean 可以获得当前的bean factory,这可以用来调用bean factory 中的任何服务。
2)BeanNameAware
实现此接口的 Bean 可以在 Spring 容器中定义其名称
一个可能的使用领域可能是您构建/扩展 Spring 框架并希望获取 bean 名称以用于记录/连接它们等。