Resource、ResourceLoader、ResourcePatternResolver、容器的关系

本文是Spring系列文章的一部分。其他相关文章见

Spring系列文章导航

本文是Spring中Resource的一个思考点。


前言

Resource、ResourceLoader、ResourcePatternResolver、容器的关系错综复杂,当简化到这种程度就比较容易看了。但是我还是在如何获取Resource上绕了一下。
在这里插入图片描述

一、一个疑问?

容器AbstractApplicationContext继承了ResourcePatternResolver,但同时有一个该类型的成员。其实例为PathMatchingResourcePatternResolver的实例。容器实现ResourcePatternResolver的getResources(String locationPattern)方法是调用PathMatchingResourcePatternResolver的实例的该方法实现的。

但是PathMatchingResourcePatternResolver的构造器是传入一个ResourceLoader来初始化的。AbstractApplicationContext实例化PathMatchingResourcePatternResolver的时候传入了自身this。而PathMatchingResourcePatternResolver又是调用ResourceLoader(也就是AbstractApplicationContext)的getResource(String location)来获取Resource。

感觉无解啊。。(大佬勿喷。)

二、直接说原因

因为AbstractApplicationContext继承自DefaultResourceLoader。DefaultResourceLoader实现了ResourceLoader,这里就有getResource(String location)的实现。

三、如果还没理解

我举个例子,如下图所示。

在这里插入图片描述

1.接口People和实现类DefaultPeople

分别定义和实现了吃饭这个功能。

public interface People {
    public void eat();
}
public class DefaultPeople implements People {
    @Override
    public void eat() {
        System.out.println("我能吃饭");
    }
}

2.接口Grandpa、Parent1和父类Parent2

Grandpa是People的子接口。
Parent1是Grandpa的子接口。
Parent2是Grandpa的实现类。

public interface Grandpa extends People{ }
public interface Parent1 extends Grandpa { }
public class Parent2 implements Grandpa {
    Grandpa grandpa;
    public Parent2(Grandpa grandpa){
        this.grandpa = grandpa;
    }
    @Override
    public void eat() {
        grandpa.eat();
    }
}

3.Son子类

继承自DefaultPeople,实现了Parent1接口。

public class Son extends DefaultPeople implements Parent1 {
    Grandpa grandpa;
    public Son(){
        grandpa = getGrandPa();
    }
    private Grandpa getGrandPa() {
        return new Parent2(this);
    }
    public static void main(String[] args) {
        Son son = new Son();
        son.grandpa.eat();
    }
}

逻辑就清楚了吧,son要eat,首先构造了一个Grandpa 的子类Parent2的实例,并把自己传给了他。
eat要调用Parent2的eat方法。但是Parent2的eat方法也是调用传入者自己的eat方法。那么最后调用的谁的eat方法。当然是Son类的eat方法。因为Son继承了DefaultPeople ,是这4个人里唯一有实现的地方。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值