委派模式
它不属于23中模式,我理解其实就是有个中间角色进行派活的过程,是一种派活的模式。-- 委托安排
Java双亲委派
说起委派,可能更容易想到的是Java双亲委派,没错,它确实也是委派模式。
在spring中应用
那么在Spring中又有哪些地方用到了委派模式呢?
在bean中的应用 - BeanDefinitionParserDelegate
前提:只有当用xml配置文件的方式来进行bean的管理时,这里的委派才会用到,注解的方式(@Autowired / @Bean等)管理bean,是不会走到这个委派的
在解析xml文件时,我们顺着以下代码,来看委派模式的体现
protected void doRegisterBeanDefinitions(Element root) {
BeanDefinitionParserDelegate parent = this.delegate;
this.delegate = createDelegate(getReaderContext(), root, parent);
if (this.delegate.isDefaultNamespace(root)) {
String profileSpec = root.getAttribute(PROFILE_ATTRIBUTE);
if (StringUtils.hasText(profileSpec)) {
String[] specifiedProfiles = StringUtils.tokenizeToStringArray(
profileSpec, BeanDefinitionParserDelegate.MULTI_VALUE_ATTRIBUTE_DELIMITERS);
// We cannot use Profiles.of(...) since profile expressions are not supported
// in XML config. See SPR-12458 for details.
if (!getReaderContext().getEnvironment().acceptsProfiles(specifiedProfiles)) {
if (logger.isDebugEnabled()) {
logger.debug("Skipped XML bean definition file due to specified profiles [" + profileSpec +
"] not matching: " + getReaderContext().getResource());
}
return;
}
}
}
// preProcess 和 postProcess 点进去会发现是空方法,这两个方法留给子类重载,体现了设计模式 - 模板方法
preProcessXml(root);
// 这里有委派模式的体现
parseBeanDefinitions(root, this.delegate);
postProcessXml(root);
this.delegate = parent;
}
顺着来到parseBeanDefinitions,来到如下代码,这里delegate根据不用元素类型,进行不同的注册操作(即体现了派活的过程)。
private void parseDefaultElement(Element ele, BeanDefinitionParserDelegate delegate) {
if (delegate.nodeNameEquals(ele, IMPORT_ELEMENT)) {
importBeanDefinitionResource(ele);
}
else if (delegate.nodeNameEquals(ele, ALIAS_ELEMENT)) {
processAliasRegistration(ele);
}
else if (delegate.nodeNameEquals(ele, BEAN_ELEMENT)) {
processBeanDefinition(ele, delegate);
}
else if (delegate.nodeNameEquals(ele, NESTED_BEANS_ELEMENT)) {
// recurse
doRegisterBeanDefinitions(ele);
}
}
在MVC中的应用
委派模式主要体现在这2句代码上,在之前的适配器模式的讲解中,我们取出对应的HandlerAdapter,然后这里用委派模式去分派具体的活,让对应的handler去执行handle方法。