美文网首页Java 杂谈java新手学习
【Spring源码解读】bean标签中的属性

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

作者: Python编程社区 | 来源:发表于2019-03-22 10:25 被阅读14次

    说明

    今天在阅读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标签中的属性

        本文链接:https://www.haomeiwen.com/subject/alqlvqtx.html