ResourceLoader和ResourceLoaderAware

Spring提供如下两个标志性接口:
(1)ResourceLoader: 该接实现类的实例可以获得一个Resource实例。
(2) ResourceLoaderAware: 该接口实现类的实例将获得一个ResourceLoader的引用在ResourceLoader接口里有如下方法:
(1)Resource getResource (String location): 该接仅有这个方法,用于返回一个Resource实例ApplicationContext实现类都实现ResourceLoader接口,因此ApplicationContext可直接获取Resource实例。

ResourceLoader接口

Spring将采用和ApplicationContext相同的策略来访问资源。

也就是说:

如果ApplicationContext是FileSystemXmlApplicationContext,res就是FileSystemResource实例;

如果ApplicationContext是ClassPathXmlApplicationContext,res就是ClassPathResource实例


当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://1ocalhost:8080/beans.xmI");

演示ResourceLoaderAware使用

public class ResourceLoaderDemo {

    @Test
    public void demo1(){
        ApplicationContext context = new ClassPathXmlApplicationContext();
        Resource resource = context.getResource("yogurt.txt");
        System.out.println(resource.getFilename());
    }

    @Test
    public void demo2(){
        ApplicationContext context = new FileSystemXmlApplicationContext();
        Resource resource = context.getResource("yogurt.txt");
        System.out.println(resource.getFilename());
    }
}

ResourceLoaderAware 接口


ResourceLoaderAware接口实现类的实例将获得一个ResourceLoader的引用,ResourceLoaderAware接口也供了一个setResourceLoader()方法,该方法将由Spring容器负责调用,Spring容器会将一个ResourceLoader对象作为该方法的参数传入。


如果把实现ResourceLoaderAware接口的Bean类部署在Spring容器中,Spring容器会将自身当成ResourceLoader作为setResourceLoader()方法的参数传入。由于ApplicationContext的实现类都实现了ResourceLoader接口,Spring容器自身完全可作为ResorceLoader使用。


演示ResourceLoaderAware使用

创建testBean(必须实现setter方法)

public class TestBean implements ResourceLoaderAware {
    private ResourceLoader resourceLoader;
    @Override
    public void setResourceLoader(ResourceLoader resourceLoader) {
        this.resourceLoader = resourceLoader;
    }

    public ResourceLoader getResourceLoader() {
        return resourceLoader;
    }
}

创建bean文件




    

创建testDemo 

public class TestDemo {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
        TestBean testBean = context.getBean("testBean", TestBean.class);
        ResourceLoader resourceLoader = testBean.getResourceLoader();

        System.out.println(context == resourceLoader);//true
    }
}

你可能感兴趣的:(java,rpc,开发语言)