1.1 IOC概念:控制反转
控制:接口实现类的控制权
反转:实现类的控制权从调用类中移除,转交给第三方决定
1.2资源抽象接口 Resource 提供了更强的底层资源访问能力
接口主要方法: boolean exists():资源是否存在
boolean isOpen()资源是否打开
URL getURL() 如果资源可以表示成url ,那么返回资源对应的url
File getFile() 如果底层资源时一个文件,那么就返回对应的File对象
InputStream getInputStream() 返回资源对象对应的输入流
Resource实现类关系如下
其中 虚线表示实现某个接口, 实线表示的时继承关系
WritableResource 可写资源接口 有两个实现类 即FileSystemResource和PathResource 类
ByteArrayResource 二进制数组表示的资源,
ClassPathResource 类路径下的资源,资源已相对于类路径的方式表示
FileSystemResource 文件系统资源,资源以文件系统路径的方式表示
InputStreamREsource 以输入流返回表示的资源
ServletContextResource 为访问Web容器上下文中的资源而设计的类,负责以相对于WEB应用根目录的路径下载资源
URLResource 封装java.net.URL 它使用户能够访问任何可以通过URL表示的资源
PathResource和ClassPathResource的具体案例
public static void textResource() throws IOException { // 测试接口Resource的使用 String filepath = "A:/ReadingSofterware/AllProjects/Mytest/TextDemon/src/main/java/com/example/text/nihao.xml"; // 使用系统文件路径方式加载文件 也可以使用FileSystemResource WritableResource res1 = new PathResource(filepath); // 使用类路径方式加载文件 Resource res2 = new ClassPathResource("conf/file1.txt"); //使用WritableResource接口写资源文件 OutputStream stream1 = res1.getOutputStream(); stream1.write("欢迎光临 小春论坛".getBytes()); stream1.close(); // 使用Resource接口读资源文件 InputStream ins1 = res1.getInputStream(); InputStream ins2 = res2.getInputStream(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); int i; while ((i = ins1.read()) != -1) { baos.write(i); } System.out.println(baos.toString()); System.out.println("res1:" + res1.getFilename()); System.out.println("res2:" + res2.getFilename()); }
资源加载默认采用系统编码读取资源内容,如果资源文件采用特殊的编码格式,可以通过EncodedResource对资源进行编码
Resource re = new ClassPathResource("conf/file1.txt"); EncodedResource ure = new EncodedResource(re, "utf-8"); String content = FileCopyUtils.copyToString(ure.getReader()); System.out.println(content);
1.3资源加载器 Spring定义的加载器如下
ResourceLoader接口有getResource(String locationl)方法 可以根据地址加载文件资源,不过,资源地址仅支持带资源前缀的表达式,不支持Ant风格的资源表达式,而ResourcePatternResolver继承自ResourceLoader扩展定义了 getResources(String location)方法,该方法支持资源表达式和Ant风格的资源路劲。 PathMatchingResourcePatternResolver是Spring提供的标准实现类
测试案例如下 下述案例能com/example目录下所有的xml文件
ResourcePatternResolver rs = new PathMatchingResourcePatternResolver(); Resource[] resources = rs.getResources("classpath*:com/example/**/*.xml"); assertNotNull(resources); for (Resource re : resources) { System.out.println(re.getDescription()); }