ResourceLoaderAware 接口是一个特殊的回调接口,用于识别期望被提供 ResourceLoader 引用的组件。下面的列表显示了 ResourceLoaderAware 接口的定义:
public interface ResourceLoaderAware {
void setResourceLoader(ResourceLoader resourceLoader);
}
当一个类实现了 ResourceLoaderAware 并被部署到应用上下文中时(作为 Spring 管理的 Bean),它被应用上下文识别为 ResourceLoaderAware。应用程序上下文然后调用 setResourceLoader(ResourceLoader)
,将自己作为参数(请记住,Spring 的所有应用程序上下文都实现了 ResourceLoader 接口)。
:::info
基本上就是 xxxApplicationContext ,比如用 ClassPathXmlApplicationContext 启动的,回调的就是 ClassPathXmlApplicationContext
:::
由于 ApplicationContext 是一个 ResourceLoader,Bean 也可以实现 ApplicationContextAware 接口并直接使用所提供的应用上下文来加载资源。然而,一般来说,如果你只需要使用专门的 ResourceLoader 接口,那会更好。代码将只与资源加载接口(可被视为一个实用接口)耦合,而不是与整个 Spring ApplicationContext 接口耦合。
在应用程序组件中,你也可以依靠资源加载器的自动装配作为实现 ResourceLoaderAware 接口的替代方案。传统的构造器和 byType 自动装配模式(如 Autowiring Collaborators 中所述)能够分别为构造器参数或 setter 方法参数提供一个 ResourceLoader。为了获得更多的灵活性(包括对字段和多参数方法进行自动装配的能力),可以考虑使用基于注解的自动装配功能。在这种情况下,只要字段、构造函数或方法带有 @Autowired
注解,ResourceLoader 就会被自动注入到期望有 ResourceLoader 类型的字段、构造函数参数或方法参数中。欲了解更多信息,请参阅使用 @Autowired。
:::info
要为包含通配符或使用特殊 classpath*:
资源前缀的资源路径加载一个或多个资源对象,可以考虑将 ResourcePatternResolver 的实例自动注入到你的应用程序组件中,而不是 ResourceLoader。
:::