`
lan_qie
  • 浏览: 12533 次
社区版块
存档分类
最新评论

我的spring笔记系列2----资源文件加载

阅读更多
Spring将资源文件定义为Resource接口,一个配置源,一个配置信息
其中最重要的方法是InputStream getInputStream();
这个接口的作用其实就是定位到具体的配置,能够用流的方式把配置读入。
常用的几个Resource实现:
ClassPathResource—调用class或classLoader的getResourceAsStream()方法
FileSystemResource----返回FileInputStream
ServletContextResource----调用ServletContext.getResourceAsStream
UrlResource----url.openConnection().getInputStream()返回url的流
ByteArrayResource----将byte数组按ByteArrayInputStream返回
InputStreamResource----封装一个InputStream
DescriptiveResource----拥有一个资源的描述,但不直接指向任何资源

载入:
配置信息载入是靠BeanDefinitionReader来完成的,
完成主要功能的4个方法:

1、从Resource里解析出单个bean的配置,然后生成BeanDefinition对象,然后把bean放入map中,完成这个事情的主要方法就是loadBeanDefinitions(Resource resource)。
int loadBeanDefinitions(Resource resource) throws BeanDefinitionStoreException;
2、这个方法是调用loadBeanDefinitions(Resource resource)的
int loadBeanDefinitions(Resource[] resources) throws BeanDefinitionStoreException;

3、这个方法需要将String location转换成Resource resource之后再调用loadBeanDefinitions(Resource resource)方法
int loadBeanDefinitions(String location) throws BeanDefinitionStoreException;
4、这个方法是调用loadBeanDefinitions(String location)的
int loadBeanDefinitions(String[] locations) throws BeanDefinitionStoreException;

另外两个辅助方法:
1、 BeanDefinitionRegistry getRegistry();
获取BeanDefinition对象要注册的那个容器,重要实现类DefaultListableBeanFactory

2、ResourceLoader getResourceLoader();
ResourceLoader主要工作是将String location转换为Resource
主要方法是: Resource getResource(String location);
以及其子类ResourcePatternResolver extends ResourceLoader中定义的
Resource[] getResources(String locationPattern) throws IOException;
从一个locationPattern中获取多个Resource
Resource getResource(String location)主要实现在DefaultResourceLoader中:
这个方法从location中获取一个Resource,主要实现为:
if (location.startsWith(“classpath:”)) {
返回ClassPathResource
} else {
try {
//如果是URL则返回UrlResource
URL url = new URL(location);
return new UrlResource(url);
}catch (MalformedURLException ex) {
//如果不是URL则交给getResourceByPath方法来完成
return getResourceByPath(location);
}
}
实现了getResourceByPath方法的主要类有:
DefaultResourceLoader----直接返回ClassPathContextResource
AbstractRefreshableWebApplicationContext
----直接返回ServletContextResource
FileSystemXmlApplicationContext----直接返回FileSystemResource
GenericWebApplicationContext----直接返回ServletContextResource
StaticWebApplicationContext----直接返回ServletContextResource
FileSystemResourceLoader----直接返回FileSystemContextResource
ServletContextResourceLoader----直接返回ServletContextResource
也就是ResourceLoader.getResource可能返回的对象有ClassPathResource、UrlResource、ClassPathContextResource、ServletContextResource、FileSystemResource、FileSystemContextResource

Resource[] getResources(String locationPattern) 主要实现在PathMatchingResourcePatternResolver中:
if (locationPattern.startsWith(“classpath*:”)) {
if (getPathMatcher().isPattern(locationPattern.substring(CLASSPATH_ALL_URL_PREFIX.length()))) {
// a class path resource pattern
return findPathMatchingResources(locationPattern);
}
else {
// all class path resources with the given name
return findAllClassPathResources(locationPattern.substring(CLASSPATH_ALL_URL_PREFIX.length()));
}
}
else {
// Only look for a pattern after a prefix here
// (to not get fooled by a pattern symbol in a strange prefix).
int prefixEnd = locationPattern.indexOf(":") + 1;
if (getPathMatcher().isPattern(locationPattern.substring(prefixEnd))) {
// a file pattern
return findPathMatchingResources(locationPattern);
}
else {
// a single resource with the given name
return new Resource[] {getResourceLoader().getResource(locationPattern)};
}
}

Spring资源定位问题:
可以有*、?两种通配符,
classpath开头表示只要找到一个即返回,可以支持通配符,通配符的实现方式是先将通配符所在那一级目录全部找出来,再去匹配
他的实现方式是会根据通配符递归找到符合规范的配置文件,但是因为调用的是classloader 的URL getResource(String name)方法,每次getResource时都只要找到一个就返回
例如:com/qie/spring/test/xml/a?.xml的查找过程是:
1、 先找到com/qie/spring/test/xml/目录
2、 然后把该目录的全部文件和文件夹列表出来
3、 一个一个的匹配a?.xml
对jar包里的:
1、 先找到com/qie/spring/test/xml/对应的jar路径,然后生成JarFile
2、 列出所有的JarEntry
3、 一个一个匹配com/qie/spring/test/xml/a?.xml
注意:jar包的方式,生成jar的时候如果没有把目录信息打进去,com/qie/spring/test/xml/对应的jar是找不到的
这两个方式可以同时存在

classpath* 调用的是classloader的Enumeration<URL> getResources(String name)方法,能将所有符合路径的文件都找出来

FileSystemXmlApplicationContext和ClassPathXmlApplicationContext支持${}引用系统变量,包括java的系统变量像user.home等,以及操作系统的环境变量JAVA_HOME、CLASSPATH等
FileSystemXmlApplicationContext  中用classpath(classpath*):com/qie/spring/test/xml/aa.xml定义配置文件路径,依然会用classpath的方式加载,
因为这两个ApplicationContext都使用PathMatchingResourcePatternResolver类中的Resource[] getResources(String locationPattern)来查找资源,classpath*的支持是在该方法中的,对不是classpath*开发的文件加载都用DefaultResourceLoader类中的Resource getResource(String location)方法加载,这个方法的实现是
如果classpath开头,直接返回ClassPathResource
否则以URL方式尝试,也就是new URL,如果能成功则返回UrlResource
否则以Resource getResourceByPath(String path)方法返回,这个方法在DefaultResourceLoader中的默认实现是用ClassPathContextResource的
在FileSystemXmlApplicationContext中重载了Resource getResourceByPath(String path)方法,返回FileSystemResource
在XmlWebApplicationContext中通过继承AbstractRefreshableWebApplicationContext重载Resource getResourceByPath(String path)方法,返回ServletContextResource


分享到:
评论

相关推荐

    SpringDM笔记6-Fragment及配置Log4j Fragment Bundle

    2. **指定Host Bundle**:在Fragment Bundle的MANIFEST.MF文件中,我们需要通过`Fragment-Host`头部声明Host Bundle的符号名。例如: ``` Fragment-Host: com.example.myapp.main ``` 3. **共享资源**:通过`...

    Spring笔记.doc

    监听器如 ContextLoaderListener 在项目启动时加载 Spring 配置文件并保存到 application 对象中,WebApplicationContextUtils 可以从 application 对象中获取 Spring 上下文。 【Spring 与 Hibernate 整合】 ...

    spring笔记

    Spring 笔记 Spring 是 Java 企业版(Java EE)应用程序的框架,提供了结构化的配置文件,实现了控制反转(IoC)和面向切面编程(AOP),支持表现层、业务逻辑层和持久层。Spring 的核心是 IoC 和 AOP,能够与主流...

    spring的学习笔记

    - **4.1 基础知识**:介绍Spring如何管理和访问资源,以及如何配置资源的加载策略。 - **4.2 内置Resource实现**:Spring内置了多种Resource实现,如ClassPathResource、FileSystemResource等,用于从不同位置加载...

    Spring 配置文件 和详细笔记

    - **资源加载**:`&lt;context:component-scan base-package="..."&gt;`扫描指定包及其子包下的组件。 - **数据源配置**:`&lt;jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/DataSource" /&gt;`从JNDI查找...

    spring-boot-04-servlet.rar

    Spring Boot使用Logback或Log4j2作为默认日志系统,通过配置文件调整日志级别和输出格式。 11. **测试Servlet应用**: 使用`MockMvc`类可以对Spring MVC控制器进行单元测试,模拟HTTP请求并验证响应。 12. **...

    Spring框架笔记

    其中`ApplicationContext`是`BeanFactory`的子接口,提供了更多高级功能,如国际化支持、资源加载等。 **2.2 DI(Dependency Injection,依赖注入)简介** - **概念**: DI是一种实现IoC的方式,即在对象创建时,...

    Spring&Mybatis&SpringMVC总结笔记-最全最基础.pdf

    本总结笔记是Spring、Mybatis、SpringMVC的综合学习资源,涵盖了这些框架的基本概念、配置方式、优点与适用场景,以及它们各自组件和功能点的详细解释。适用于初学者入门学习,同时也可以作为面试时的参考资料,帮助...

    Spring全家桶知识笔记.pdf

    Spring的IoC容器在这些基础上提供了更多高级服务,比如bean的实例缓存、生命周期管理、代理、事件发布和资源加载等。 Spring的高层容器视图展示了容器启动时如何读取应用提供的配置信息,生成bean配置注册表,然后...

    spring3.x的读书笔记-2

    这种方式常用于加载配置文件或资源文件,它根据给定的类路径位置来定位资源。 Resource接口提供了一些方法来操作和访问资源,例如读取内容、检查是否存在、获取URL等。在示例中,我们看到了EncodedResource的使用,...

    韩顺平spring笔记及PPT资料

    《韩顺平Spring笔记及PPT资料》是一份详尽且深入的学习资源,由知名IT教育专家韩顺平老师精心编制。这份资料旨在帮助学习者掌握Spring框架的核心概念和技术,以便在实际开发中灵活运用。Spring是Java企业级应用开发...

    Spring Boot 学习笔记完整教程.pdf

    - 配置应用:Spring Boot允许用户进行静态资源处理、任务调度、自定义配置文件读取等,以及自定义启动Banner和配置文件的热部署。 - 系统监控:Spring Boot可以集成Spring Actuator,帮助开发者监控和管理生产环境中...

    spring 笔记大全

    ### Spring 笔记大全知识点梳理 #### 一、Spring 概述 - **Spring 定义**:Spring 是一个开源的 Java 平台框架,它提供了全面的基础架构支持,使得开发者能够更容易地构建企业级应用。Spring 的核心是依赖注入...

    Spring笔记.md

    // 加载配置文件 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml"); Student student = (Student) applicationContext.getBean("student"); System.out.println(student)...

    Spring经典笔记

    【Spring经典笔记】 Spring框架是Java企业级应用开发中的核心框架,它提供了全面的解决方案,包括数据访问、事务管理、AOP(面向切面编程)、MVC(模型-视图-控制器)等。本笔记主要关注Spring的基础知识,特别是...

    spring boot基础笔记

    它依据项目中添加的jar依赖来猜测需要配置的内容,并通过spring.factories文件中配置的EnableAutoConfiguration的值来决定需要加载的配置类。Spring Boot提供了大量的自动配置类,这些类会在Spring应用启动时被加载...

    Spring 学习笔记 spring帮助文档

    在本篇Spring学习笔记中,我们将深入探讨Spring的基本概念,包括bean的配置、依赖注入、IOC容器以及Bean的实例化方式。 首先,Spring中的核心概念是bean。Bean是Spring框架中的基本构建块,它们是被管理的对象,...

    spring笔记 工作原理

    根据提供的文件信息,我们可以深入探讨Spring框架的工作原理及其在企业级应用中的重要作用。Spring作为一款广泛使用的Java开发框架,其核心特性包括依赖注入(DI)、面向切面编程(AOP)、以及提供了强大的数据访问...

    spring2.5 学习笔记

    ### Spring 2.5 学习笔记知识点梳理 #### 第一课:面向抽象编程 - **定义**:面向抽象编程是一种编程范式,强调通过抽象类或接口来设计程序结构,减少对具体实现的依赖。 - **优势**: - 提高了系统的可维护性与...

Global site tag (gtag.js) - Google Analytics