publicBeanDefinitionHolderparseBeanDefinitionElement(Element ele,@NullableBeanDefinition containingBean){//id 属性String id = ele.getAttribute(ID_ATTRIBUTE);//name 属性String nameAttr = ele.getAttribute(NAME_ATTRIBUTE);//别名集合List<String> aliases =newArrayList<>();if(StringUtils.hasLength(nameAttr)){//name可能有多个,需要转成数组String[] nameArr =StringUtils.tokenizeToStringArray(nameAttr,MULTI_VALUE_ATTRIBUTE_DELIMITERS);//name 也算是 一种别名
aliases.addAll(Arrays.asList(nameArr));}//判断id是否存在与别名中,如果存在 则获取第一个别名String beanName = id;if(!StringUtils.hasText(beanName)&&!aliases.isEmpty()){
beanName = aliases.remove(0);if(logger.isTraceEnabled()){
logger.trace("No XML 'id' specified - using '"+ beanName +"' as bean name and "+ aliases +" as aliases");}}if(containingBean ==null){//检查id的唯一性checkNameUniqueness(beanName, aliases, ele);}//将bean标签中的属性解析到BeanDefinition各个属性中AbstractBeanDefinition beanDefinition =parseBeanDefinitionElement(ele, beanName, containingBean);if(beanDefinition !=null){if(!StringUtils.hasText(beanName)){try{if(containingBean !=null){
beanName =BeanDefinitionReaderUtils.generateBeanName(
beanDefinition,this.readerContext.getRegistry(),true);}else{
beanName =this.readerContext.generateBeanName(beanDefinition);// Register an alias for the plain bean class name, if still possible,// if the generator returned the class name plus a suffix.// This is expected for Spring 1.2/2.0 backwards compatibility.String beanClassName = beanDefinition.getBeanClassName();if(beanClassName !=null&&
beanName.startsWith(beanClassName)&& beanName.length()> beanClassName.length()&&!this.readerContext.getRegistry().isBeanNameInUse(beanClassName)){//将beanName放入别名集合中
aliases.add(beanClassName);}}if(logger.isTraceEnabled()){
logger.trace("Neither XML 'id' nor 'name' specified - "+"using generated bean name ["+ beanName +"]");}}catch(Exception ex){error(ex.getMessage(), ele);returnnull;}}String[] aliasesArray =StringUtils.toStringArray(aliases);//将beanDefinition,beanName 别名集合 封装成BeanDefinitionHolderreturnnewBeanDefinitionHolder(beanDefinition, beanName, aliasesArray);}returnnull;}
parseBeanDefinitionElement()方法
publicAbstractBeanDefinitionparseBeanDefinitionElement(Element ele,String beanName,@NullableBeanDefinition containingBean){this.parseState.push(newBeanEntry(beanName));//获取class属性String className =null;if(ele.hasAttribute(CLASS_ATTRIBUTE)){
className = ele.getAttribute(CLASS_ATTRIBUTE).trim();}//获取parent属性String parent =null;if(ele.hasAttribute(PARENT_ATTRIBUTE)){
parent = ele.getAttribute(PARENT_ATTRIBUTE);}try{//创建BeanDefinition 返回的是 GenericBeanDefinitionAbstractBeanDefinition bd =createBeanDefinition(className, parent);//解析bean标签上的属性parseBeanDefinitionAttributes(ele, beanName, containingBean, bd);//设置bean的描述信息
bd.setDescription(DomUtils.getChildElementValueByTagName(ele,DESCRIPTION_ELEMENT));//解析meta标签parseMetaElements(ele, bd);//解析lookup-methodparseLookupOverrideSubElements(ele, bd.getMethodOverrides());//解析replace-methodparseReplacedMethodSubElements(ele, bd.getMethodOverrides());//解析构造函数parseConstructorArgElements(ele, bd);//解析propertyparsePropertyElements(ele, bd);//解析qualifierparseQualifierElements(ele, bd);
bd.setResource(this.readerContext.getResource());
bd.setSource(extractSource(ele));return bd;}catch(ClassNotFoundException ex){error("Bean class ["+ className +"] not found", ele, ex);}catch(NoClassDefFoundError err){error("Class that bean class ["+ className +"] depends on not found", ele, err);}catch(Throwable ex){error("Unexpected failure during bean definition parsing", ele, ex);}finally{this.parseState.pop();}returnnull;}
parseBeanDefinitionAttributes()方法
publicAbstractBeanDefinitionparseBeanDefinitionAttributes(Element ele,String beanName,@NullableBeanDefinition containingBean,AbstractBeanDefinition bd){//判断是否有singleton属性 存在则报错if(ele.hasAttribute(SINGLETON_ATTRIBUTE)){error("Old 1.x 'singleton' attribute in use - upgrade to 'scope' declaration", ele);}//获取scope 作用域elseif(ele.hasAttribute(SCOPE_ATTRIBUTE)){
bd.setScope(ele.getAttribute(SCOPE_ATTRIBUTE));}elseif(containingBean !=null){// Take default from containing bean in case of an inner bean definition.
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));}//解析primaryif(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);}elseif(this.defaults.getInitMethod()!=null){
bd.setInitMethodName(this.defaults.getInitMethod());
bd.setEnforceInitMethod(false);}//解析destroy-mehtodif(ele.hasAttribute(DESTROY_METHOD_ATTRIBUTE)){String destroyMethodName = ele.getAttribute(DESTROY_METHOD_ATTRIBUTE);
bd.setDestroyMethodName(destroyMethodName);}elseif(this.defaults.getDestroyMethod()!=null){
bd.setDestroyMethodName(this.defaults.getDestroyMethod());
bd.setEnforceDestroyMethod(false);}//解析factory-mehtodif(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;}