8 -- 深入使用Spring -- 3...2 ResouceLoader 接口和 ResourceLoaderAware 接口
8.3.2 ResouceLoader 接口和 ResourceLoaderAware 接口
Spring 提供如下两个标志性接口:
⊙ ResourceLoader : 该接口实现类的实例可以获得一个Resource实例。
⊙ ResourceLoaderAware : 该接口实现类的实例将获得一个ResourceLoader的引用。
在ResourceLoader接口里有如下方法:
⊙ Resource getResource(String location) : 该接口仅包含这个方法,该方法用于返回一个Resource实例。ApplicationContext的实现类都实现ResourceLoader接口,因此ApplicationContext可用于直接获取Resource实例。
Class : ClassPathXmlApplicationContext
package edu.pri.lime._8_3_2.main; import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.Resource; public class lll { public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext();
// 通过ApplicationContext访问资源
// ApplicationContext实例获取Resource实例时,默认采用与ApplicationContext相同的资源访问策略
Resource res = ctx.getResource("myTemplate.txt");
}
}
Console :
myTemplate.txt
class path resource [myTemplate.txt]
Class : FileSystemApplicationContext
package edu.pri.lime._8_3_2.main; import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
import org.springframework.core.io.Resource; public class FileSystemXML { public static void main(String[] args) {
ApplicationContext ctx = new FileSystemXmlApplicationContext();
Resource res = ctx.getResource("myTemplate.txt");
System.out.println(res.getFilename());
System.out.println(res.getDescription());
}
}
Console :
myTemplate.txt
file [E:\Users\Administrator\workspace\lime\myTemplate.txt]
Spring将采用和ApplicationContext相同的策略来访问资源。也就是说,如果ApplicationContext是FileSystemXmlApplicationContext,res就是FileSystemResource实例;如果ApplicationContext是ClassPathXmlApplicationContext,res就是ClassPathResource实例;如果ApplicationContext是XmlWebApplicationContext,res就是ServletContextResource实例。
当Spring应用需要进行资源访问时,实际上并不需要直接使用Resource实现类,而是调用ResourceLoader实例的getResource()方法来获得资源。ReosurceLoader将会负责选择Reosurce实现类,也就是确定具体的资源访问策略,从而将应用程序和具体的资源访问策略分离开来,这就是典型的策略模式。
使用ApplicationContext访问资源时,可通过不同前缀指定强制使用指定的ClassPathResource、FileSystemResource等实现类。
Resource res = ctx.getResource("calsspath:bean.xml");
Resrouce res = ctx.getResource("file:bean.xml");
Resource res = ctx.getResource("http://localhost:8080/beans.xml");
ResourceLoaderAware完全类似于Spring提供的BeanFactoryAware、BeanNameAware接口,ResourceLoaderAware接口也提供了一个setResourceLoader()方法,该方法将由Spring容器负责调用,Spring容器会将一个ResourceLoader对象作为该方法的参数传入。
如果把实现ResourceLoaderAware接口的Bean类部署在Spring容器中,Spring容器会将自身当成ResourceLoader作为setResourceLoader()方法的参数传入。由于ApplicationContext的实现类都实现了ResourceLoader接口,Spring容器自身完全可作为ResorceLoader使用。
Class : TestBean
package edu.pri.lime._8_3_2.bean.impl; import org.springframework.context.ResourceLoaderAware;
import org.springframework.core.io.ResourceLoader; public class TestBean implements ResourceLoaderAware{ private ResourceLoader resourceLoader; // 实现ResourceLoaderAware接口必须实现的方法
// 如果把该Bean部署在Spring容器中,该方法将会有Spring容器负责调用。
// SPring容器调用该方法时,Spring会将自身作为参数传给该方法。
public void setResourceLoader(ResourceLoader resourceLoader) {
this.resourceLoader = resourceLoader;
} // 返回ResourceLoader对象的应用
public ResourceLoader getResourceLoader(){
return this.resourceLoader;
} }
Class : SpringTest
package edu.pri.lime._8_3_2.bean.main; import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader; import edu.pri.lime._8_3_2.bean.impl.TestBean; public class SpringTest { public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("app_8_3_3.xml");
TestBean testBean = ctx.getBean("testBean",TestBean.class);
ResourceLoader resourceLoader = testBean.getResourceLoader();
System.out.println("Spring容器将自身注入到ResourceLoaderAware Bean 中 ? :" + (resourceLoader == ctx));
Resource resource = resourceLoader.getResource("myTemplate.txt");
System.out.println(resource.getFilename());
System.out.println(resource.getDescription());
}
}
Console :
Spring容器将自身注入到ResourceLoaderAware Bean 中 ? :true
myTemplate.txt
class path resource [myTemplate.txt]
啦啦啦
啦啦啦
啦啦啦
8 -- 深入使用Spring -- 3...2 ResouceLoader 接口和 ResourceLoaderAware 接口的更多相关文章
- Spring源码分析——BeanFactory体系之接口详细分析
Spring的BeanFactory的继承体系堪称经典.这是众所周知的!作为Java程序员,不能错过! 前面的博文分析了Spring的Resource资源类Resouce.今天开始分析Spring的I ...
- Spring IOC三种注入方式(接口注入、setter注入、构造器注入)(摘抄)
IOC ,全称 (Inverse Of Control) ,中文意思为:控制反转, Spring 框架的核心基于控制反转原理. 什么是控制反转?控制反转是一种将组件依赖关系的创建和管理置于程序外部的技 ...
- Spring Resource之ResourceLoaderAware接口
ResourceLoaderAware接口是一个特殊的标记接口,它表示对象需要提供给一个ResourceLoader引用: public interface ResourceLoaderAware { ...
- 如何手动获取Spring容器中的bean(ApplicationContextAware 接口)
ApplicationContextAware 接口的作用 先来看下Spring API 中对于 ApplicationContextAware 这个接口的描述: 即是说,当一个类实现了这个接口之 ...
- Spring InitializingBean 接口以及Aware接口实现的原理
关于Spring InitializingBean 接口以及Aware接口实现的其实都在 第11步中: finishBeanFactoryInitialization() 方法中完成了3部分的内容: ...
- Spring Boot REST(一)核心接口
Spring Boot REST(一)核心接口 Spring 系列目录(https://www.cnblogs.com/binarylei/p/10117436.html) SpringBoot RE ...
- Spring AOP 自定义注解获取http接口及WebService接口入参和出参
注解方法实现过程中可以采用如下获取方式:—以下为例 HttpServletRequest request = ((ServletRequestAttributes) RequestContextHo ...
- java web项目(spring项目)中集成webservice ,实现对外开放接口
什么是WebService?webService小示例 点此了解 下面进入正题: Javaweb项目(spring项目)中集成webservice ,实现对外开放接口步骤: 准备: 采用与spring ...
- spring boot 2 集成JWT实现api接口认证
JSON Web Token(JWT)是目前流行的跨域身份验证解决方案.官网:https://jwt.io/本文使用spring boot 2 集成JWT实现api接口验证. 一.JWT的数据结构 J ...
随机推荐
- _mysql.c:29:20: error: Python.h: No such file or directory
在Centos系统中安装 pip install MySQL-python 提示: _mysql.c:29:20: error: Python.h: No such file or directory ...
- 在CentOS 6.4中支持exfat格式的U盘
CentOS系列一直没有默认支持使用exfat格式的大容量U盘. 可以通过添加fuse-exfat模块来支持.根据网上资料,整理如下: 1.下载fuse-exfat支持软件: exfat支持是通过fu ...
- nginx 4层tcp代理获取真实ip
举个例子,Nginx 中的代理配置假如是这样配置的: location / { proxy_http_version 1.1; proxy_set_header X-Real-IP $remote_a ...
- elasticsearch 服务安全配置
elasticsearch安装与使用(5)-- search guard安装与配置 一.安装search guard插件必须要安装两部分: ①search-guard-xx ②search-gua ...
- 百度网盘 http://pandownload.com/index.html
https://github.com/high-speed-downloader/high-speed-downloader
- Eclipse启动都会Error when loading the SDK
http://jingyan.baidu.com/article/aa6a2c14fb54190d4c19c480.html
- PHP zhuaq
change_html_img_src.php <?php $url=$_GET['url']; $id=$_GET['id']; $type=$_GET['type']; $redis_key ...
- Linux共享库 Linux内核链表
#ifndef __LINKEDLIST_H_ #define __LINKEDLIST_H_ #include <stdlib.h> #define offsetof(type, mem ...
- SAP中方会计凭证打印解决方案
中方会计凭证由于 编码格式 以及 科目对照关系 是无法直接使用SAP自带的凭证打印功能的,如下为客户开发的一个解决方案,供各位参考 1).需要定制几个Table的结构 zc0000fit0009[科目 ...
- JDK源码阅读之Collection
源码版本:JDK 1.7. 集合 Collection,根据已知的内容可以知道有List.Set.Map(严格说,Map不属于Collection)等大类. 先查看 Collection, publi ...