最近听了讲解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源码的人,所以无从下手,只好在此发问,望有大神能回复给我一个思路。
loadBeanDefinitions(beanFactory);
我的理解是在某个方法内,在
runtime
时,调用抽象方法的具体实现、在接口中使用default
方法调用接口方法、或者在方法中得到某个接口的实现类对象,并调用其方法。此时可称为委派....