zoukankan      html  css  js  c++  java
  • 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:UsersAdministratorworkspacelimemyTemplate.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]

            

    啦啦啦

    啦啦啦

    啦啦啦

  • 相关阅读:
    Flume_常见的几个问题
    Flume_使用
    Flume_初识
    日志分析_对一号店日志分析
    Hadoop_UDTF示例
    Hadoop_UDAF示例
    Hadoop_UDF示例
    Hive_数据倾斜处理
    Hadoop openssl false
    饶过验证后,用post的方式发送Http请求,获得response相应内容
  • 原文地址:https://www.cnblogs.com/ClassNotFoundException/p/6390967.html
Copyright © 2011-2022 走看看