对之前学习的一些总结

Spring一点总结:
到现在为止一脸蒙蔽的看完了Spring源码解析的前三章,大概的总结一下流程:….
鬼知道我都学习了什么
主要学习的是Bean包。

  1. 配置文件读取
    XmlBeanDefinitionReader对XML文件进行读取
    BeanFactory bf=new XmlBeanFactory(new ClassPathResource(“bean.xml”));
  2. 配置文件的封装
    通过ClassPathResource进行封装的。根据ClassPathResource的构造函数来构造Resource文件。转化为Resource使用的是EncodeResource类。
  3. 完成封装之后,交给了XmlBeanDefinitionReader处理,在XmlBeanFactory进行资源的初始化;使用XMLBeanFactory的构造方法进行初始化进行构造
  4. 在构造方法中调用了this.reader.loadBeanDefinitions(resource);方法进行资源的加载
  5. 在loadBeanDefinitions方法中调用了this.doLoadBeanDefinitions(inputSource, encodedResource.getResource());方法。
  6. doLoadBeanDefinitions中首先通过getValidationModeForResource对XML文件进行验证DTD和XSD模式两种,验证完成之后调用了doLoadDocument获得Document对象。
  7. 当把文件转化成为Document对象之后,接下来进行bean对象的提取及注册,调用了registerBeanDefinitions方法,在该方法中调用了registerBeanDefinitions(Document doc, XmlReaderContext readerContext)方法
  8. 该方法调用了doRegisterBeanDefinitions(Element root)方法进行处理,在该方法中有preProcessXml(root);是解析前的处理,this.postProcessXml(root);解析后的处理。this.parseBeanDefinitions(root, this.delegate);实现处理
  9. parseBeanDefinitions(root, this.delegate);是对Xml文件中的Bean进行处理的,在Spring中的bean有两大类声明,一类是默认的,另一类是自定义的。首先说明默认的处理的方法,在该方法中调用了this.parseDefaultElement(ele, delegate);方法对morning的进行 了处理。
  10. parseDefaultElement(Element ele, BeanDefinitionParserDelegate delegate)中主要分为了4种情况,分别是对import标签的处理importBeanDefinitionResource(ele);对alias标签的处理processAliasRegistration(ele);对bean标签的处理processBeanDefinition(ele, delegate);对beans标签的处理doRegisterBeanDefinitions(ele);当每一个标签在处理完成之后,刷新缓存,通知相关的监听器,即这个bean标签就加载完成了。
    接下来主要讨论对bean标签的处理。
    processBeanDefinition(Element ele, BeanDefinitionParserDelegate delegate)方法主要是对bean标签的处理。通过parseBeanDefinitionElement(ele)方法创建BeanDefinitionHolder对象,
    1.提取元素中的id,name属性;
    2.如果bean没有name,按照Spring的默认的规则生成name,
    3.进一步解析其他属性,封装到AbstractBeanDefinition中(实现了BeanDefinition接口,有3个实现的子类RootBeanDefinition、ChildBeanDefinition、GenericBeanDefinition)
    4.将获取到的信息封装到BeanDefinitionHolder中。
    对其他属性的封装的过程:在parseBeanDefinitionElement方法中调用了
    parseBeanDefinitionElement()方法解析了class属性、parent属性,然后传入这两个参数创建了GenericBeanDefinition的AbstractBeanDefinition对象。调用了parseBeanDefinitionAttributes解析默认bean的各种属性、调用了parseMetaElements解析meta、parseLookupOverrideSubElements解析lookup-method、
    parseReplacedMethodSubElements解析replaced-method、parseConstructorArgElements解析构造参数、parsePropertyElements解析property参数、parseQualifierElements解析qualifier参数。
    parseBeanDefinitionAttributes解析默认bean的各种属性:
    分别解析了scope、singleton、abstract、lazy-init、autowire、dependency-check、depends-on、autowire-candidate、primary、init-method、destory-method、factory-method、factory-bean属性。
    在processBeanDefinition方法中parseBeanDefinitionElement是对默认的标签进行解析,当得到的bdholder不为空时,需要对bdholder中的自定义标签进行解析decorateBeanDefinitionIfRequired(ele, bdHolder);自定义的解析在后面会详细的讲解,当自定义解析完成了之后,调用registerBeanDefinition方法完成注册注册中分别调用了registerBeanDefinition方法进行了beanName注册和registerAlias进行别名注册。在注册完成之后通过this.getReaderContext().fireComponentRegistered(new BeanComponentDefinition(bdHolder));方法通知监听器解析及完成注册。
    接下来分别是对alias标签、import标签、beans标签进行解析的,大致过程与bean标签相似。
    以上的总结是包括了第二章和第三章的主要内容,主要是通过读取xml文件,转化成为resource进行封装,然后再封装为Document对象。使用Document对象进行bean的加载和解析。主要是解析了默认的标签、属性。接下来学习自定义的标签。

你可能感兴趣的:(Java,Spring)