解析bean标签BeanDefinition
bean标签的所有子元素在BeanDefinition对象中都有与之相对应的属性。
BeanDefinition BeanDefinition是一个接口,描述了Bean实例的定义。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 public interface BeanDefinition extends AttributeAccessor , BeanMetadataElement { String SCOPE_SINGLETON = ConfigurableBeanFactory.SCOPE_SINGLETON; String SCOPE_PROTOTYPE = ConfigurableBeanFactory.SCOPE_PROTOTYPE; int ROLE_APPLICATION = 0 ; int ROLE_SUPPORT = 1 ; int ROLE_INFRASTRUCTURE = 2 ; void setParentName (@Nullable String parentName) ; @Nullable String getParentName () ; void setBeanClassName (@Nullable String beanClassName) ; @Nullable String getBeanClassName () ; void setScope (@Nullable String scope) ; @Nullable String getScope () ; void setLazyInit (boolean lazyInit) ; boolean isLazyInit () ; void setDependsOn (@Nullable String... dependsOn) ; @Nullable String[] getDependsOn(); void setAutowireCandidate (boolean autowireCandidate) ; boolean isAutowireCandidate () ; void setPrimary (boolean primary) ; boolean isPrimary () ; void setFactoryBeanName (@Nullable String factoryBeanName) ; @Nullable String getFactoryBeanName () ; void setFactoryMethodName (@Nullable String factoryMethodName) ; @Nullable String getFactoryMethodName () ; ConstructorArgumentValues getConstructorArgumentValues () ; default boolean hasConstructorArgumentValues () { return !getConstructorArgumentValues().isEmpty(); } MutablePropertyValues getPropertyValues () ; default boolean hasPropertyValues () { return !getPropertyValues().isEmpty(); } void setInitMethodName (@Nullable String initMethodName) ; @Nullable String getInitMethodName () ; void setDestroyMethodName (@Nullable String destroyMethodName) ; @Nullable String getDestroyMethodName () ; void setRole (int role) ; int getRole () ; void setDescription (@Nullable String description) ; @Nullable String getDescription () ; ResolvableType getResolvableType () ; boolean isSingleton () ; boolean isPrototype () ; boolean isAbstract () ; @Nullable String getResourceDescription () ; @Nullable BeanDefinition getOriginatingBeanDefinition () ; }
BeanDefinition的父类 如上可以看出BeanDefinition
继承自AttributeAccessor
和BeanMetadataElement
。
AttributeAccessor 该接口定义了与其他对象的元数据进行连接和访问的约定,即对属性的获取、设置、删除:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 public interface AttributeAccessor { void setAttribute (String name, @Nullable Object value) ; @Nullable Object getAttribute (String name) ; @SuppressWarnings("unchecked") default <T> T computeAttribute (String name, Function<String, T> computeFunction) { Assert.notNull(name, "Name must not be null" ); Assert.notNull(computeFunction, "Compute function must not be null" ); Object value = getAttribute(name); if (value == null ) { value = computeFunction.apply(name); Assert.state(value != null , () -> String.format("Compute function must not return null for attribute named '%s'" , name)); setAttribute(name, value); } return (T) value; } @Nullable Object removeAttribute (String name) ; boolean hasAttribute (String name) ; String[] attributeNames(); }
1 2 3 4 5 6 7 public interface BeanMetadataElement { @Nullable default Object getSource () { return null ; } }
BeanDefinition的子类 三个常用的子类:
package org.springframework.beans.factory.support.RootBeanDefinition
package org.springframework.beans.factory.support.ChildBeanDefinition
package org.springframework.beans.factory.support.RootBeanDefinition
如果配置文件中定义了父 bean
和 子 bean
,则父 bean
用 RootBeanDefinition 表示,子 bean
用 ChildBeanDefinition 表示,而没有父 bean
的就使用RootBeanDefinition 表示。
解析bean标签 createBeanDefinition()
方法在 BeanDefinitionParserDelegate.parseBeanDefinitionElement(Element ele, String beanName, BeanDefinition containingBean)
方法中进行bean
标签解析的过程中,内部调用了该方法。
BeanDefinitionParserDelegate.createBeanDefinition()
返回AbstractBeanDefinition
对象,方法内部调用的BeanDefinitionReaderUtils.createBeanDefinition()
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 protected AbstractBeanDefinition createBeanDefinition (@Nullable String className, @Nullable String parentName) throws ClassNotFoundException { return BeanDefinitionReaderUtils.createBeanDefinition( parentName, className, this .readerContext.getBeanClassLoader()); }public static AbstractBeanDefinition createBeanDefinition (@Nullable String parentName, @Nullable String className, @Nullable ClassLoader classLoader) throws ClassNotFoundException { GenericBeanDefinition bd = new GenericBeanDefinition (); bd.setParentName(parentName); if (className != null ) { if (classLoader != null ) { bd.setBeanClass(ClassUtils.forName(className, classLoader)); } else { bd.setBeanClassName(className); } } return bd; }
parseBeanDefinitionAttributes()
方法执行完createBeanDefinition()
方法返回AbstractBeanDefinition
对象后,进而执行该方法进行bean的属性设置。
BeanDefinitionParserDelegate.parseBeanDefinitionAttributes()
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 public AbstractBeanDefinition parseBeanDefinitionAttributes (Element ele, String beanName, @Nullable BeanDefinition containingBean, AbstractBeanDefinition bd) { if (ele.hasAttribute(SINGLETON_ATTRIBUTE)) { error("Old 1.x 'singleton' attribute in use - upgrade to 'scope' declaration" , ele); } else if (ele.hasAttribute(SCOPE_ATTRIBUTE)) { bd.setScope(ele.getAttribute(SCOPE_ATTRIBUTE)); } else if (containingBean != null ) { bd.setScope(containingBean.getScope()); } if (ele.hasAttribute(ABSTRACT_ATTRIBUTE)) { bd.setAbstract(TRUE_VALUE.equals(ele.getAttribute(ABSTRACT_ATTRIBUTE))); } String lazyInit = ele.getAttribute(LAZY_INIT_ATTRIBUTE); if (isDefaultValue(lazyInit)) { lazyInit = this .defaults.getLazyInit(); } bd.setLazyInit(TRUE_VALUE.equals(lazyInit)); String autowire = ele.getAttribute(AUTOWIRE_ATTRIBUTE); bd.setAutowireMode(getAutowireMode(autowire)); if (ele.hasAttribute(DEPENDS_ON_ATTRIBUTE)) { String dependsOn = ele.getAttribute(DEPENDS_ON_ATTRIBUTE); bd.setDependsOn(StringUtils.tokenizeToStringArray(dependsOn, MULTI_VALUE_ATTRIBUTE_DELIMITERS)); } 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)); } if (ele.hasAttribute(PRIMARY_ATTRIBUTE)) { bd.setPrimary(TRUE_VALUE.equals(ele.getAttribute(PRIMARY_ATTRIBUTE))); } 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 ); } 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 ); } if (ele.hasAttribute(FACTORY_METHOD_ATTRIBUTE)) { bd.setFactoryMethodName(ele.getAttribute(FACTORY_METHOD_ATTRIBUTE)); } if (ele.hasAttribute(FACTORY_BEAN_ATTRIBUTE)) { bd.setFactoryBeanName(ele.getAttribute(FACTORY_BEAN_ATTRIBUTE)); } return bd; }
BeanDefinition解析的整体流程 下边四篇进行具体分析。
解析 BeanDefinition 的入口在DefaultBeanDefinitionDocumentReader的.parseBeanDefinitions(Element root, BeanDefinitionParserDelegate delegate)
方法 。该方法会根据命令空间来判断标签是默认标签 还是自定义标签 ,其中:
默认标签,由 parseDefaultElement(Element ele, BeanDefinitionParserDelegate delegate)
方法来实现
自定义标签,由 BeanDefinitionParserDelegate 的 parseCustomElement(Element ele, @Nullable BeanDefinition containingBd)
方法来实现。
在默认标签解析中,会根据标签名称的不同进行 import
、alias
、bean
、beans
四大标签进行处理。其中 bean
标签的解析为核心,它由 processBeanDefinition(Element ele, BeanDefinitionParserDelegate delegate)
方法实现。
processBeanDefinition(Element ele, BeanDefinitionParserDelegate delegate)
方法,开始进入解析核心工作,分为三步:
解析默认标签的默认 标签:BeanDefinitionParserDelegate.parseBeanDefinitionElement(Element ele, ...)
方法。该方法会依次解析 bean
标签的属性、各个子元素,解析完成后返回一个 GenericBeanDefinition 实例对象。
解析默认标签下的自定义 标签:BeanDefinitionParserDelegate.decorateBeanDefinitionIfRequired(Element ele, BeanDefinitionHolder definitionHolder)
方法。
注册解析的 BeanDefinition:BeanDefinitionReaderUtils#registerBeanDefinition(BeanDefinitionHolder definitionHolder, BeanDefinitionRegistry registry)
方法。