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框架的核心组件,最出色和指的学习的是其中提供的各种工具类的实现,其次,便是整个框架导出都有体现的特点–设计;相关文章推荐
- Spring基础特性总结一--核心组件Bean的使用
- [WebKit] JavaScriptCore解析--基础篇(二)解释器基础与JSC核心组件
- Spring核心组件bean、context、core
- Spring核心组件bean、context、core
- [WebKit] JavaScriptCore解析--基础篇(二)解释器基础与JSC核心组件
- 执行代码[WebKit] JavaScriptCore解析--基础篇(二)解释器基础与JSC核心组件
- java基础学习总结三(jdk7新特性、变量(局部变量和成员变量)、常量以及运算符)
- 黑马程序员——java基础(总结、设计模式、java新特性)
- Spring知识点总结(四)之SpringAOP基础 - 代理设计模式
- Java核心技术及面试指南 设计模式部分的面试题总结以及答案
- Spring核心组件详解(Bean、Context、Core)
- 执行代码[WebKit] JavaScriptCore解析--基础篇(二)解释器基础与JSC核心组件
- spring中基础核心接口总结
- springboot基础总结以及Java系统部署脚本使用
- 项目开发中的一些注意事项以及技巧总结 基于Repository模式设计项目架构—你可以参考的项目架构设计 Asp.Net Core中使用RSA加密 EF Core中的多对多映射如何实现? asp.net core下的如何给网站做安全设置 获取服务端https证书 Js异常捕获
- 信息安全系统设计基础第八周总结
- 信息安全系统设计基础第四周学习总结
- Spring技术内幕4——springmvc组件的初始化以及http请求映射(二)
- Java高手真经. 编程基础卷:Java核心编程技术:Java基础+核心库+图形+网络+高级特性
- 20135213——信息安全系统设计基础第九周学习总结