Spring中的委派模式

最近听了讲解spring源码的课,其中对委派模式有点不甚理解。我理解的委派模式就是个中介。类A封装了类B的方法,从而别的类只要调类A就行了,不需要知道类B的存在。

但是在课中,听到的委派模式和我理解的不一样。

以下是spring中的源码 - 5.0.2版本
ps:我是从FileSystemXmlApplicationContext中的构造器中的refresh()方法开始往下看的

例子1:AbstractApplicationContext类

protected ConfigurableListableBeanFactory obtainFreshBeanFactory() {
        //这里使用了委派设计模式,父类定义了抽象的refreshBeanFactory()方法,具体实现调用子类容器的refreshBeanFactory()方法
        refreshBeanFactory();
        ConfigurableListableBeanFactory beanFactory = getBeanFactory();
        if (logger.isDebugEnabled()) {
            logger.debug("Bean factory for " + getDisplayName() + ": " + beanFactory);
        }
        return beanFactory;
    }

例子2:AbstractRefreshableApplicationContext类

@Override
    protected final void refreshBeanFactory() throws BeansException {
        //如果已经有容器,销毁容器中的bean,关闭容器
        if (hasBeanFactory()) {
            destroyBeans();
            closeBeanFactory();
        }
        try {
            //创建IOC容器
            DefaultListableBeanFactory beanFactory = createBeanFactory();
            beanFactory.setSerializationId(getId());
            //对IOC容器进行定制化,如设置启动参数,开启注解的自动装配等
            customizeBeanFactory(beanFactory);
            //调用载入Bean定义的方法,主要这里又使用了一个委派模式,在当前类中只定义了抽象的loadBeanDefinitions方法,具体的实现调用子类容器
            loadBeanDefinitions(beanFactory);
            synchronized (this.beanFactoryMonitor) {
                this.beanFactory = beanFactory;
            }
        }
        catch (IOException ex) {
            throw new ApplicationContextException("I/O error parsing bean definition source for " + getDisplayName(), ex);
        }
    }

还有很多....都说是用了委派设计模式(也没说为什么..不然我也不会到这问了..)。但是我没看出来是用了委派模式,这不就是继承了父类,实现了父类定义的方法,那当然调用方法时,执行的是子类的方法了。委派模式的特点跟这个好像一点关系都挂不上。

委派模式的特点:

1、类似于中介的功能(委托机制)
2、持有被委托人的引用
3、不关心过程,只关心结果

google了很多,对于委派模式在spring中的体现好像资料很少,以至于没搜到啥。甚是不解呀,身边没有精通spring源码的人,所以无从下手,只好在此发问,望有大神能回复给我一个思路。

阅读 4k
3 个回答

loadBeanDefinitions(beanFactory);
我的理解是在某个方法内,在runtime时,调用抽象方法的具体实现、在接口中使用default方法调用接口方法、或者在方法中得到某个接口的实现类对象,并调用其方法。此时可称为委派....

新手上路,请多包涵

我觉得这个应该是模板方法模式,抽象类定义了具体的一套执行流程,而子类则负责参与其中具体的某一环节的工作。
另外也是多态的体现。

新手上路,请多包涵

外面的方法是可以是模板模式,他说的委派应该是 委派给子类去实现 而自己不实现,不要过程,注重结果。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题