4.5 ResourceLoaderAware 接口
ResourceLoaderAware
是一个特殊的标记接口,用来标记提供 ResourceLoader
引用的对象。
public interface ResourceLoaderAware {
void setResourceLoader(ResourceLoader resourceLoader);
}
当将一个 ResourceLoaderAware
接口的实现类部署到应用上下文时(此类会作为一个 spring 管理的 bean), 应用上下文会识别出此为一个 ResourceLoaderAware
对象,并将自身作为一个参数来调用setResourceLoader()
函数,如此,该实现类便可使用ResourceLoader
获取Resource
实例来加载你所需要的资源。(附:为什么能将应用上下文作为一个参数来调用 setResourceLoader()
函数呢?不要忘了,在前文有谈过,spring 的所有上下文都实现了ResourceLoader
接口)。
当然了,一个 bean 若想加载指定路径下的资源,除了刚才提到的实现 ResourcesLoaderAware
接口之外(将 ApplicationContext
作为一个 ResourceLoader
对象注入),bean 也可以实现ApplicationContextAware
接口,这样可以直接使用应用上下文来加载资源。但总的来说,在需求满足都满足的情况下,最好是使用的专用 ResourceLoader
接口,因为这样代码只会与接口耦合,而不会与整个 spring ApplicationContext
耦合。与 ResourceLoader 接口耦合
,抛开 spring 来看,就是提供了一个加载资源的工具类接口
。
从 spring 2.5 开始,除了实现ResourceLoaderAware
接口,也可采取另外一种替代方案——依赖于 ResourceLoader
的自动装配。"传统"的constructor
和 bytype
自动装配模式都支持ResourceLoader
的装配(可参阅 Section 3.4.5, “自动装配协作者”)——前者以构造参数的形式装配,后者以 setter 方法中参数装配。若为了获得更大的灵活性(包括属性注入的能力和多参方法),可以考虑使用基于注解的新注入方式。使用注解 @Autowired
标记ResourceLoader 变量
,便可将其注入到成员属性、构造参数或方法参数中( @Autowired
详细的使用方法可参考Section 3.9.2, “@Autowired”.)。