ITEEDU

Spring Gossip: Aware 相关接口

对于Bean来说,最佳的情况是它根本不知道自己是被Spring容器所管理,Bean可以作自己该从事的工作,而不会与Spring容器产生耦合。

然而有时候,您必须让Bean知道容器管理它的一些细节,必须让Bean知道自己在容器中是以哪个名称所管理的,或者是让它知道 BeanFactory、ApplicationContext 的存在,例如若Bean可以意识到ApplicationContext的存在的话,在Bean的某些动作发生时,可以发出事件让感兴趣的接受者来处理。

Spring中提供一些Aware相关接口,像是org.springframework.beans.factory.BeanNameAware、 org.springframework.beans.factory.BeanFactoryAware、 org.springframework.context.ApplicationContextAware等等,实作这些Aware界面的Bean在被 初始之后,可以取得一些相对应的资源。

例如实作BeanNameAware接口的Bean,在属性设定完成后、初始化方法之前(例如InitializingBean的 afterPropertiesSet()方法或自定义的init方法),会将Bean于定义档中的名称透过setBeanFactory()方法设定给 Bean:

package org.springframework.beans.factory;
public interface BeanNameAware {
	public void setBeanName(String name);
}

实作BeanFactoryAware接口的Bean,在属性设定完成后、初始化方法之前,Spring容器将会注入BeanFactory的实例:

package org.springframework.beans.factory;
public interface BeanFactoryAware {
	public void setBeanFactory(BeanFactory beanFactory) throws BeansException;
}

而实作ApplicationContextAware的Bean,在Bean被初始后,将会被注入ApplicationContext的实例:

package org.springframework.context;
public interface ApplicationContextAware {
	public void setApplicationContext(ApplicationContext context) throws BeansException;
}

另外还有org.springframework.context.ResourceLoaderAware接口,可以让Bean取得ResourceLoader实例,并进一步取得相关的资源文件。

然而必须注意的是,一但Bean意识到Spring的相关资源,就表示Bean开始与Spring产生耦合,因而就不易移植至其它的应用程序或框架之中。