您的位置:首页 > 编程语言 > Java开发

Spring基础特性总结二 --- 核心组件Core以及Resource的设计

2017-09-10 23:23 746 查看

文章内容

1.Core组件的作用

2.Core提供的工具类

3.Resource接口的设计

4.总结

1.Core组件的作用

Core是主要提供Spring框架使用的一些基础操作的实现(包括convert、io、task等);在Spring框架中起到核心工具类的作用;

2.Core提供的工具类

2.1.类型转换(convert)

最外层定义了类型转换相关的类型和异常;

convertor子包:Factory(类型转换工厂)、Registry(注册)、Convertor(类型转换的实现接口)

support子包(Spring基本所有的实现都在support包中):支持各种类型转换的Convertor的实现;

很好的设计

2.2.更灵活的枚举类型的实现(enum)

封装了基础的enum类型,实现更灵活的创建和操作;

2.3.统一的资源访问方式(io)

屏蔽了资源(文件、URL等)的提供者和使用者的不同带来的io操作的不同,定义了统一的接口和适配方式;

2.4.序列化操作(Serializer)

主要包括以下两个类的实现:

DefaultDeserializer:将byte[]反序列化为Object

DefaultSerializer:将Object序列化为byte[]

2.5.任务执行(Task)

支持的任务类型:同步(Sync)和异步(Async)

支持的任务的操作:create(创建)、submit([Future])、撤销;

2.6.其他工具类的实现(Util)

除了前面设计的基础操作,其他的工具类的实现在util包中,包括一些很常见的类型:FileCopyUtil、NumberUtil、PatterMatcher等,最常使用的StingUtils也在其中;两个主要的子包为:

comparator:类型比较

xml:XML对象操作相关

代码搬运工

3.Resource接口的设计

Core中Resource的实际很好的屏蔽了数据提供者的不同带来的差异,Resource接口封装了各种可能的资源类型;



首先,InputStreamSource中只有一个函数接口的定义,说明所有的IO操作最终都是通过InputStream 来完成的,无论上层提供怎样形式的封装:

InputStream getInputStream()


其次Resource接口的定义如下:

public interface Resource extends InputStreamSource {
boolean exists();
boolean isReadable();
boolean isOpen();
URL getURL() throws IOException;
URI getURI() throws IOException;
File getFile() throws IOException;
long contentLength() throws IOException;
long lastModified() throws IOException;
Resource createRelative(String relativePath) throws IOException;
String getFilename();
String getDescription();
}


这些操作基本属于所有的资源类型的一致操作;

然后是关于AbstractResource的实现,实现了Resource接口的一些一致的函数比如exist和contentLength等;对于一些设计到资源类型可能会有不同的操作直接抛出异常,留给更具体的实现来完成;

以FileSystemResource为例,在构造函数中传入当前File对象,对于AbstractResource尚需实现的函数如getFile()和contentLength(),这通过File对象的属性来完成;

public class FileSystemResource extends AbstractResource {

private final File file;

private final String path;

public InputStream getInputStream() throws IOException {
return new FileInputStream(this.file);
}

public File getFile() {
return this.file;
}
... ...


最后,是Resource加载的问题,比如在Spring定义的各种配置文件是如何根据我们传入的路径读取的,需要通过ResourceLoader来完成;

public interface ResourceLoader {
Resource getResource(String location);
ClassLoader getClassLoader();
}


其中,默认的getResource实现如下:

public Resource getResource(String location) {
Assert.notNull(location, "Location must not be null");
if (location.startsWith(CLASSPATH_URL_PREFIX)) {
return new ClassPathResource(location.substring(CLASSPATH_URL_PREFIX.length()), getClassLoader());
}
else {
try {
// Try to parse the location as a URL...
URL url = new URL(location);
return new UrlResource(url);
}
catch (MalformedURLException ex) {
// No URL -> resolve as resource path.
return getResourceByPath(location);
}
}
}


可以看出在定义路径是使用CLASSPATH_URL_PREFIX前缀或者指定资源的完整路径即可;

4.总结

Core组件作为Spring框架的核心组件,最出色和指的学习的是其中提供的各种工具类的实现,其次,便是整个框架导出都有体现的特点–设计;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐