在 Spring 中,策略模式主要应用在资源加载器(ResourceLoader)接口中。资源加载器用于加载资源,Spring 提供了多个资源加载器的实现类,如 ClassPathResourceLoader、FileSystemResourceLoader 等。这些实现类就是策略,将不同的资源加载方式适配到 ResourceLoader 接口中。
下面是一个使用策略模式的示例代码:
public interface Resource {
InputStream getInputStream() throws IOException;
}
public interface ResourceLoader {
Resource getResource(String location);
}
public class ClassPathResourceLoader implements ResourceLoader {
private ClassLoader classLoader;
public ClassPathResourceLoader() {
this.classLoader = ClassUtils.getDefaultClassLoader();
}
public ClassPathResourceLoader(ClassLoader classLoader) {
this.classLoader = classLoader;
}
@Override
public Resource getResource(String location) {
Assert.notNull(location, "Location must not be null");
if (location.startsWith("/")) {
location = location.substring(1);
}
return new ClassPathResource(location, this.classLoader);
}
}
public class FileSystemResourceLoader implements ResourceLoader {
private final String rootPath;
public FileSystemResourceLoader() {
this.rootPath = "";
}
public FileSystemResourceLoader(String rootPath) {
Assert.notNull(rootPath, "Root path must not be null");
this.rootPath = rootPath;
}
@Override
public Resource getResource(String location) {
Assert.notNull(location, "Location must not be null");
String path = StringUtils.applyRelativePath(this.rootPath, location);
return new FileSystemResource(path);
}
}
public static void main(String[] args) throws IOException {
ResourceLoader loader = new ClassPathResourceLoader();
Resource resource = loader.getResource("spring.xml");
System.out.println(resource.getInputStream().available());
loader = new FileSystemResourceLoader();
resource = loader.getResource("/Users/username/spring.xml");
System.out.println(resource.getInputStream().available());
}
在上面的代码中,Resource 是一个资源加载器返回的资源对象接口,ResourceLoader 是资源加载器接口。
ClassPathResourceLoader 和 FileSystemResourceLoader 都是 ResourceLoader 接口的实现类,分别用于从类路径和文件系统中加载资源。
这些实现类将不同的资源加载方式适配到 getResource 方法中。在 main 方法中,我们通过 ClassPathResourceLoader 和 FileSystemResourceLoader 来加载 spring.xml 文件,并输出了其输入流的可用字节数。这样,使用不同的 ResourceLoader 就可以根据不同的资源类型选择不同的加载方式,从而实现了策略模式的应用。