BeanNameAware
和BeanFactoryAware
有什么用?我正在研究spring并遇到了这两个接口。
我用谷歌搜索了他们但没有任何用处。
请告诉我BeanNameAware
和BeanFactoryAware
接口的功能是什么以及何时使用这些接口?
答案 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名称以进行日志记录/连接它们等。