【Spring源码解读】bean标签中的属性

说明

今天在阅读Spring源码的时候,发现在加载xml中的bean时,解析了很多标签,其中有常用的如:scope、autowire、lazy-init、init-method、destroy-method等等。但还有很多很少用甚至没用过的标签,看来对这个经常使用的框架,还是知之甚少,本着探索的精神,决定将bean中所有相关标签的作用做一次整理,以便完善自己的知识体系。

另外,说明一下,使用的Spring源码版本为当前最新版本5.2.0.BUILD-SNAPSHOT,跟老版本中的相关代码可能会有少数差异。

Spring中对属性标签的解析

解析Spring中bean的属性标签的源码位置位于类:BeanDefinitionParserDelegate 的 parseBeanDefinitionAttributes 方法中,源码如下:

public AbstractBeanDefinition parseBeanDefinitionAttributes(Element ele, String beanName,

@Nullable BeanDefinition containingBean, AbstractBeanDefinition bd) {

// 解析 singleton 属性,当前版本已不支持该属性,如使用将会抛出异常

if (ele.hasAttribute(SINGLETON_ATTRIBUTE)) {

error("Old 1.x 'singleton' attribute in use - upgrade to 'scope' declaration", ele);

}

// 解析 scope 属性

else if (ele.hasAttribute(SCOPE_ATTRIBUTE)) {

bd.setScope(ele.getAttribute(SCOPE_ATTRIBUTE));

}

else if (containingBean != null) {

// 如果当前 bean 没有设置 scope 属性且当前 bean 是其他 bean 的内部 bean,则设置为其外部 bean 的 scope 属性值

bd.setScope(containingBean.getScope());

}

// 解析 abstract 属性

if (ele.hasAttribute(ABSTRACT_ATTRIBUTE)) {

bd.setAbstract(TRUE_VALUE.equals(ele.getAttribute(ABSTRACT_ATTRIBUTE)));

}

// 解析 lazy-init 属性

String lazyInit = ele.getAttribute(LAZY_INIT_ATTRIBUTE);

if (isDefaultValue(lazyInit)) {

lazyInit = this.defaults.getLazyInit();

}

bd.setLazyInit(TRUE_VALUE.equals(lazyInit));

// 解析 autowire 属性

String autowire = ele.getAttribute(AUTOWIRE_ATTRIBUTE);

bd.setAutowireMode(getAutowireMode(autowire));

// 解析 depends-on 属性

if (ele.hasAttribute(DEPENDS_ON_ATTRIBUTE)) {

String dependsOn = ele.getAttribute(DEPENDS_ON_ATTRIBUTE);

bd.setDependsOn(StringUtils.tokenizeToStringArray(dependsOn, MULTI_VALUE_ATTRIBUTE_DELIMITERS));

}

// 解析 autowire-candidate 属性

String autowireCandidate = ele.getAttribute(AUTOWIRE_CANDIDATE_ATTRIBUTE);

if (isDefaultValue(autowireCandidate)) {

String candidatePattern = this.defaults.getAutowireCandidates();

if (candidatePattern != null) {

String[] patterns = StringUtils.commaDelimitedListToStringArray(candidatePattern);

bd.setAutowireCandidate(PatternMatchUtils.simpleMatch(patterns, beanName));

}

}

else {

bd.setAutowireCandidate(TRUE_VALUE.equals(autowireCandidate));

}

// 解析 primary 属性

if (ele.hasAttribute(PRIMARY_ATTRIBUTE)) {

bd.setPrimary(TRUE_VALUE.equals(ele.getAttribute(PRIMARY_ATTRIBUTE)));

}

// 解析 init-method 属性

if (ele.hasAttribute(INIT_METHOD_ATTRIBUTE)) {

String initMethodName = ele.getAttribute(INIT_METHOD_ATTRIBUTE);

bd.setInitMethodName(initMethodName);

}

else if (this.defaults.getInitMethod() != null) {

// 如果没有设置该属性,则设置为默认值

bd.setInitMethodName(this.defaults.getInitMethod());

bd.setEnforceInitMethod(false);

}

// 解析 destroy-method 属性

if (ele.hasAttribute(DESTROY_METHOD_ATTRIBUTE)) {

String destroyMethodName = ele.getAttribute(DESTROY_METHOD_ATTRIBUTE);

bd.setDestroyMethodName(destroyMethodName);

}

else if (this.defaults.getDestroyMethod() != null) {

bd.setDestroyMethodName(this.defaults.getDestroyMethod());

bd.setEnforceDestroyMethod(false);

}

// 解析 factory-method 属性

if (ele.hasAttribute(FACTORY_METHOD_ATTRIBUTE)) {

bd.setFactoryMethodName(ele.getAttribute(FACTORY_METHOD_ATTRIBUTE));

}

// 解析 factory-bean 属性

if (ele.hasAttribute(FACTORY_BEAN_ATTRIBUTE)) {

bd.setFactoryBeanName(ele.getAttribute(FACTORY_BEAN_ATTRIBUTE));

}

return bd;

}

里面可以看到对 bean 标签中的很多属性进行了解析,接下来的几篇里,就来看看每个属性的作用。(第一个已经废弃的属性就不说了‍)

我做开发十多年的时间,如果大家对于学习java的学习方法,学习路线以及你不知道自己应该是自学还是培训的疑问,都可以随时来问我,大家可以加我的java交流学习qun:四九四,八零一,九三一,qun内有学习教程以及开发工具。

你可能感兴趣的:(【Spring源码解读】bean标签中的属性)