【Spring 源码解读】bean 标签中的属性
说明
今天在阅读Spring 源码的时候,发现在加载xml 中的bean 时,解析了很多标签,其中有常⽤的如:scope 、autowire 、lazy-init 、init-method 、destroy-method 等等。但还有很多很少⽤甚⾄没⽤过的标签,看来对这个经常使⽤的框架,还是知之甚少,本着探索的精神,决定将bean 中所有相关标签的作⽤做⼀次整理,以便完善⾃⼰的知识体系。
另外,说明⼀下,使⽤的Spring 源码版本为当前最新版本,跟⽼版本中的相关代码可能会有少数差异。
Spring 中对属性标签的解析解析Spring 中bean 的属性标签的源码位置位于类: 的 ⽅法中,源码如下:
5.2.0.BUILD-SNAPSHOT BeanDefinitionParrDelegate parBeanDefinitionAttributes public AbstractBeanDefinition parBeanDefinitionAttributes(Element ele, String beanName,
@Nullable BeanDefinition containingBean, AbstractBeanDefinition bd) { // 解析 singleton 属性,当前版本已不⽀持该属性,如使⽤将会抛出异常
if (ele.hasAttribute(SINGLETON_ATTRIBUTE)) {
error("Old 1.x 'singleton' attribute in u - upgrade to 'scope' declaration", ele);
} // 解析 scope 属性
el if (ele.hasAttribute(SCOPE_ATTRIBUTE)) {
鸭嘴鱼吃什么食物
bd.Attribute(SCOPE_ATTRIBUTE));
}
el if (containingBean != null) {
// 如果当前 bean 没有设置 scope 属性且当前 bean 是其他 bean 的内部 bean ,则设置为其外部 bean 的 scope 属性值
bd.Scope());
长征七律诗}
// 解析 abstract 属性
if (ele.hasAttribute(ABSTRACT_ATTRIBUTE)) {
麦味地黄丸的功效与作用
bd.tAbstract(TRUE_VALUE.Attribute(ABSTRACT_ATTRIBUTE)));
}
// 解析 lazy-init 属性
String lazyInit = Attribute(LAZY_INIT_ATTRIBUTE);
if (isDefaultValue(lazyInit)) {
lazyInit = LazyInit();
}
bd.tLazyInit(TRUE_VALUE.equals(lazyInit));
// 解析 autowire 属性
String autowire = Attribute(AUTOWIRE_ATTRIBUTE);
bd.tAutowireMode(getAutowireMode(autowire));
/
/ 解析 depends-on 属性 if (ele.hasAttribute(DEPENDS_ON_ATTRIBUTE)) {
String dependsOn = Attribute(DEPENDS_ON_ATTRIBUTE);
bd.kenizeToStringArray(dependsOn, MULTI_VALUE_ATTRIBUTE_DELIMITERS));
}
// 解析 autowire-candidate 属性
String autowireCandidate = Attribute(AUTOWIRE_CANDIDATE_ATTRIBUTE);
if (isDefaultValue(autowireCandidate)) {
String candidatePattern = AutowireCandidates();
if (candidatePattern != null) {
String[] patterns = aDelimitedListToStringArray(candidatePattern);
bd.tAutowireCandidate(PatternMatchUtils.simpleMatch(patterns, beanName)); }
}
el {
服饰购bd.tAutowireCandidate(TRUE_VALUE.equals(autowireCandidate));
}
爽朗是什么意思// 解析 primary 属性
兼职劳动合同范本if (ele.hasAttribute(PRIMARY_ATTRIBUTE)) {
bd.tPrimary(TRUE_VALUE.Attribute(PRIMARY_ATTRIBUTE)));
} // 解析 init-method 属性
if (ele.hasAttribute(INIT_METHOD_ATTRIBUTE)) {
String initMethodName = Attribute(INIT_METHOD_ATTRIBUTE);
bd.tInitMethodName(initMethodName);
}
el if (InitMethod() != null) {
// 如果没有设置该属性,则设置为默认值
bd.tInitMethodName(InitMethod());
bd.tEnforceInitMethod(fal);搞怪名字
}
// 解析 destroy-method 属性
if (ele.hasAttribute(DESTROY_METHOD_ATTRIBUTE)) {
String destroyMethodName = Attribute(DESTROY_METHOD_ATTRIBUTE);
bd.tDestroyMethodName(destroyMethodName);
}
梦见手表是什么意思
el if (DestroyMethod() != null) {
bd.tDestroyMethodName(DestroyMethod());
bd.tEnforceDestroyMethod(fal);
}
// 解析 factory-method 属性
// 解析 factory-method 属性
if (ele.hasAttribute(FACTORY_METHOD_ATTRIBUTE)) {
bd.Attribute(FACTORY_METHOD_ATTRIBUTE));
}
// 解析 factory-bean 属性
if (ele.hasAttribute(FACTORY_BEAN_ATTRIBUTE)) {
bd.Attribute(FACTORY_BEAN_ATTRIBUTE));
}
return bd;
}
⾥⾯可以看到对 bean 标签中的很多属性进⾏了解析,接下来的⼏篇⾥,就来看看每个属性的作⽤。(第⼀个已经废弃的属性就不说了 )