通过上次Factory中分享,我们使用 FileSystemXmlApplicationContext 举例,其中赋予Application具体加载资源的功能,是因为大部分 ApplicationContext 都继承了 AbstractApplicationContext,而 AbstractApplicationContext 继承实现了 DefaultResourceLoader 。DefaultResourceLoader 中包含了加载资源的功能方法。
下面就从 DefaultResourceLoader 的源码入手,看看其是如何支持扩展的:
public class DefaultResourceLoader implements ResourceLoader { private ClassLoader classLoader; /** * 创建默认的资源加载器。其中 ClassLoader 默认是当前线程的ContextClassLaoder。 * @see java.lang.Thread#getContextClassLoader() */ public DefaultResourceLoader() { this.classLoader = ClassUtils.getDefaultClassLoader(); } /** * 创建默认的资源加载器。 其中 ClassLoader 被指定。 */ public DefaultResourceLoader(ClassLoader classLoader) { this.classLoader = classLoader; } public void setClassLoader(ClassLoader classLoader) { this.classLoader = classLoader; } public ClassLoader getClassLoader() { return (this.classLoader != null ? this.classLoader : ClassUtils.getDefaultClassLoader()); } // 核心方法,获取资源。 // 如果是用“classpath:”开头的资源返回 ClassPathResource,其他情况返回URL资源。 // 如果URL资源创建失败,交给 getResourceByPath 方法供子类扩展。 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); } } } /** * 通过指定的路径获取资源。 * 默认实现是使用类路径资源(ClassPathContextResource) 。 * 子类可以选择扩展这个方法达到新的资源加载的目的, 例如实现Servlet容器的资源加载。 * @param path the path to the resource * @return the corresponding Resource handle * @see ClassPathResource * @see org.springframework.context.support.FileSystemXmlApplicationContext#getResourceByPath * @see org.springframework.web.context.support.XmlWebApplicationContext#getResourceByPath */ protected Resource getResourceByPath(String path) { return new ClassPathContextResource(path, getClassLoader()); } /** * ClassPathContextResource 定义,继承了ClassPathResource,后面会相信说明这个类。 */ private static class ClassPathContextResource extends ClassPathResource implements ContextResource { public ClassPathContextResource(String path, ClassLoader classLoader) { super(path, classLoader); } public String getPathWithinContext() { return getPath(); } @Override public Resource createRelative(String relativePath) { String pathToUse = StringUtils.applyRelativePath(getPath(), relativePath); return new ClassPathContextResource(pathToUse, getClassLoader()); } } }
通过上面代码,我们可以出子类主要是通过 getResourceByPath(String)方法来实现自己的资源类型。默认支持的资源加载类型是类加载资源和URL资源。在上篇文章的分享中的 FileSystemXmlAppplicationContext 中就扩展了这个方法来支持文件方式(FileSystemResource)的加载资源文件。
下面在说说Spring中资源定义的体系。
Spring 是把所有的资源,包含类路径的、文件的、URL的等等都抽象成为 Resource 接口。关键接口的定义,可以查看 Spring的源码或G一下,网上有很多的介绍。我整理了一下他们类图,可以有个整体的认识,如下:
上图灰色的是内部类,但是他们都是我们常用的 ResourceLoader 中定义的。例如 ClassPathContextResource 是定义在 DefaultResourceLoader 中,FileSystemContextResource 定义在 FileSystemResourceLoader中。关于 BeanDefinitionResource,他是一个内部的 Resource,具体的使用方式在后期的分享中会详细的讨论到。
重点介绍几个Resource:
- FileSystemResource
继承AbstractResource同时实现了WritableResource。FileSystemResource 是需要指定一个文件,无论是java.io.File 还是文件路径,他都需要具体的文件存在。同时,其还实现了 WritableResource 来支持文件的写入操作。
下面的代码是 FileSystemResource 的具体实现:
/** * This implementation opens a FileInputStream for the underlying file. * @see java.io.FileInputStream */ public InputStream getInputStream() throws IOException { return new FileInputStream(this.file); } /** * This implementation returns a URL for the underlying file. * @see java.io.File#toURI() */ @Override public URL getURL() throws IOException { return this.file.toURI().toURL(); } /** * This implementation returns a URI for the underlying file. * @see java.io.File#toURI() */ @Override public URI getURI() throws IOException { return this.file.toURI(); } /** * This implementation returns the underlying File reference. */ @Override public File getFile() { return this.file; } /** * This implementation opens a FileOutputStream for the underlying file. * @see java.io.FileOutputStream */ public OutputStream getOutputStream() throws IOException { return new FileOutputStream(this.file); }
相关推荐
7. **资源管理**: Spring容器还可以管理其他的资源,比如数据库连接、JMS消息等,提供统一的接口进行操作。 学习Spring IOC,你需要理解Bean的定义、作用域、依赖注入的原理和方式,以及如何通过配置文件或注解来...
SpringIOC是Spring Framework中的核心组件之一,负责管理应用程序中的对象、依赖关系和生命周期。 在 Spring IOC 中,对象的创建和管理是通过 BeanFactory 或 ApplicationContext 实现的。BeanFactory 是 Spring ...
1. **spring-context-3.1.2.RELEASE.jar**:提供Spring的IoC(Inversion of Control)容器和AOP(Aspect Oriented Programming)支持,这是Spring框架的基础,为Spring Security提供了配置和事件处理能力。...
Spring的核心模块提供了如IoC(Inversion of Control,控制反转)容器、AOP代理、事件传播、资源处理等功能。同时,它还可能包含Spring与其他技术的集成,如Spring JDBC、Spring ORM(对象关系映射)用于数据库操作...
1. **spring-core-3.2.0.RELEASE.jar**:这是Spring框架的核心模块,提供了基本的IoC(Inversion of Control,控制反转)和DI(Dependency Injection,依赖注入)功能,以及资源加载和通用工具类。 2. **spring-...
在Spring Framework中,IoC(Inversion of Control,控制反转)是核心概念之一,它使得应用程序的组件不再直接创建依赖对象,而是由Spring容器来管理和维护。BeanDefinition就是实现这一概念的关键元素,它包含了...
Spring IoC,全称为Inversion of Control,即控制反转,是Spring框架的核心特性之一。它是一种设计模式,改变了传统程序中的对象创建和管理的方式,将对象的生命周期管理交由Spring容器来负责,使得代码更加解耦,...
3. **spring-context**: 扩展了IoC容器,引入了上下文概念,提供了对国际化、事件、资源、缓存等支持。 4. **spring-aop**: 实现了面向切面编程(AOP),允许定义方法拦截器和切面,用于实现如日志、事务管理等功能。...
资源名称:拓薪教育-Spring内幕深入剖析和实战精讲资源目录:【】01.拓薪教育-spring3.2-序【】02.拓薪教育-Spring3.2-介绍IOC上【】03.拓薪教育-spring3.2-介绍IOC下【】04.拓薪教育-spring3.2-AOP和其他功能介绍...
Spring IoC 加载流程讲解 在本节中,我们将对 Spring IoC 加载流程进行详细的讲解,并探讨 IoC 思想和依赖倒置原则的应用。 IoC 控制反转 IoC(Inversion of Control)是指在软件设计中,将对象实例的控制权从...
这个名为"spring-framework-1.0-with-dependencies.zip"的压缩包包含了Spring Framework 1.0版本及其相关的依赖库,是初学者和开发者了解早期Spring框架的重要资源。 在Spring 1.0版本中,核心概念主要围绕IoC...
在本资源"手写spring ioc(三) 资源org.zip"中,我们主要关注的是如何实现一个简易版的Spring IOC(Inversion of Control)容器,它涵盖了ioc的基本功能,包括解决循环依赖、使用构造器注入以及自动注入等核心特性。...
例如,关于IoC(Inversion of Control,控制反转)的实现,Spring使用了XML配置或注解来定义bean的依赖关系,通过反射机制动态加载和管理bean。另外,AOP模块实现了切面编程,允许我们定义横切关注点,如日志、事务...
标题《Spring IoC源码深度剖析开源架构源码2021.pdf》和描述《Spring IoC源码深度剖析开源架构源码2021.pdf》表明该文档主要面向于分析Spring框架中控制反转(IoC)容器的核心源码,解析和理解其内部的工作机制及...
Spring IOC,即Spring控制反转,是Spring框架的核心特性之一。控制反转(Inversion of Control,简称IoC)是一种设计原则,用于减少代码间的耦合,提高系统模块化和代码的重用性。在Spring框架中,IOC具体体现在对...
在Spring框架中,依赖注入(Inversion of Control, IoC)和面向切面编程(Aspect Oriented Programming, AOP)是两大核心特性。本篇将深入探讨如何通过注解方式来模拟Spring的这两种机制,帮助你理解其底层原理。 #...
Spring Framework 是一个开源的应用...总的来说,“spring-framework-5.3.7.RELEASE-dist.zip”是开发者开始或升级Spring项目的重要资源,包含了所有必要的组件和文档,能够帮助开发者高效地构建和管理Java应用程序。
Spring的核心在于IoC(Inversion of Control)和AOP(Aspect-Oriented Programming)。IoC容器管理对象的生命周期和依赖关系,而AOP则实现了关注点分离,提高了代码的可维护性。在源码中,我们可以看到`org.spring...
Java反射和Spring IOC是Java开发中的两个重要概念,它们在构建灵活、可扩展的应用程序时起着关键作用。本文将深入探讨这两个主题,并提供相关的学习资源。 首先,让我们了解一下Java反射。Java反射机制是Java语言的...
Spring IOC(Inversion of Control,控制反转)是Spring框架的核心组成部分,它负责管理应用程序中的对象。这个基础jar包集合包含了Spring框架实现IOC功能所需的基本组件。以下是对这些jar包及其包含的知识点的详细...