背景简介
出现的原因
我们在上面的AbstractBeanDefinitionParser
中,将所有的注册、通知还有id、别名相关的其他东西都给默认实现了,还提供了一堆用于流程控制的方法——shouldXXXXX
。
我们只需要根据各自需求实现parseInternal
方法完成基本 BD 的生成,然后根据具体需求实现shouldXXXX
来控制那些流程要走、那些流程不走即可。
我们这里进一步对parseInternal
方法做了简化——BD 相关的通用属性都给你搞进去了,你只需要自己定义一些属性的填充工作即可。
职责
简化自定义的操作。但是也将自定义命名空间解析器的灵活度降低了。
注意点
有点鸡肋,除非必须要用时用来少写点代码,否则一般用不到。
源码
继承关系
1.png源码
protected final AbstractBeanDefinition parseInternal(Element element, ParserContext parserContext) {
// 生成 BeanDefinitionBuilder 实例,用来方便填充属性。类似 StringBuilder
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition();
String parentName = getParentName(element);// 用于自定义获得 父BD 的方法
if (parentName != null) {
builder.getRawBeanDefinition().setParentName(parentName);
}
Class<?> beanClass = getBeanClass(element);// 用于自定义获得 BeanClass 的方法
if (beanClass != null) {
builder.getRawBeanDefinition().setBeanClass(beanClass);
} else {
String beanClassName = getBeanClassName(element);// 用于自定义获得 BeanClassName 的方法
if (beanClassName != null) {
builder.getRawBeanDefinition().setBeanClassName(beanClassName);
}
}
builder.getRawBeanDefinition().setSource(parserContext.extractSource(element));
BeanDefinition containingBd = parserContext.getContainingBeanDefinition();
if (containingBd != null) {
// Inner bean definition must receive same scope as containing bean.
builder.setScope(containingBd.getScope());
}
if (parserContext.isDefaultLazyInit()) {
// Default-lazy-init applies to custom bean definitions as well.
builder.setLazyInit(true);
}
doParse(element, parserContext, builder);// 用于自定义其他属性的解析逻辑
return builder.getBeanDefinition();
}
思路和我们之前介绍的AbstractBeanDefinitionParser
一样,没得说。
问题
其实个人觉得,作出这些限制固然能进一步简化实现成本,但是为了方便使用而做的了解工作也加重了,有点得不偿失。领会精神吧。
网友评论