打码赚钱哪家站好原创文学网 - 纯净的绿色文学家园 !

打码赚钱哪家站好

打码赚钱哪家站好(全文在线阅读> 

没有半分迟疑,兄妹二人飞快的盘膝坐在地上,拼命的催动自己不多的魂力抵挡毒素蔓延。这是他们现在唯一能做的事情。

软件邀新

其中,日用器具占据了店铺大约一半地面积,剩余的才是武器、防具一类,在店铺前厅与后面工作间中央用长条黑色慢布隔开,慢布每隔三米,就有一个直径一米的白色铁字,看上去很有气势。
安禄山眉头一皱,有些担心地道:“如果一直服用双倍,那这次新药,会不会达不到我想要的效果?”

可是蒂可却还是强行压制住了,坚定了自己的念头,可是她又无法否认自己爱上刘皓,一想到自己等一下要杀死刘皓,那一种心痛让她无法接受,所以她决定和刘皓一起死。

解析代码如下


Spring IOC BeanDefinition解析

IOC(Inversion of Control)即控制反转,是说创建对象的控制权进行了转移,以前创建对象的主动权和创建时机是由自己把控的,而现在这种权利转移到Spring IOC容器。许多非凡的应用,都是由两个或者多个类通过彼此的合作依赖来实现业务逻辑的,在Spring中,这些依赖关系可以通过把对象的依赖注入交给IOC容器来管理,这样在解耦代码的同时提高了代码的可测试性。

1.    加载bean

加载bean的流程:

(1)     封装资源文件。当进入XmlBeanDefinitionReader后首先对参数Resource使用EncodedResource类进行封装。

(2)     获取输入流。从Resource中获取对应的InputStream并构造InputSource。

(3)     通过构造的InputSource实例和Resource实例继续调用函数doLoadBeanDefinitions。

我们来看一下doLoadBeanDefinitions函数的具体的实现过程(中间省略了loadBeanDefinitions具体方法的一步):

    public int loadBeanDefinitions(Resource resource) throws BeanDefinitionStoreException {
        return loadBeanDefinitions(new EncodedResource(resource));
}

继续跟进代码,进入真正的核心处理部分doLoadBeanDefinitions(inputSource, encodedResource.getResource())

protected int doLoadBeanDefinitions(InputSource inputSource, Resource resource)
           throws BeanDefinitionStoreException {
        try {
           Document doc = doLoadDocument(inputSource, resource);
           return registerBeanDefinitions(doc, resource);
        }
        catch (BeanDefinitionStoreException ex) {
           throw ex;
        }
        // ……省略异常处理部分
    }

 

在上面冗长的代码中,假如不考虑异常类的代码,其实只做了三件事,这三件事的每一件事都必不可少。

(1)     获取对XML文件的验证模式。

(2)     加载XML文件,并得到对应的Document。

(3)     根据返回的Document注册bean信息。

2.    获取XML的验证模式

  protected Document doLoadDocument(InputSource inputSource, Resource resource) throws Exception {
          return this.documentLoader.loadDocument(inputSource, getEntityResolver(), this.errorHandler,
                        getValidationModeForResource(resource), isNamespaceAware());
   }

 2.1验证模式的读取

了解XML文件的读者都应该知道XML文件的验证模式保证了XML文件的正确性,而比较常用的验证模式有两种:DTD和XSD。

对于验证模式,读者可以自行查阅数据了解。

验证模式的读取方法如下:

  protected int getValidationModeForResource(Resource resource) {
        int validationModeToUse = getValidationMode();
        if (validationModeToUse != VALIDATION_AUTO) {
           return validationModeToUse;
        }
        int detectedMode = detectValidationMode(resource);
        if (detectedMode != VALIDATION_AUTO) {
           return detectedMode;
        }
        // Hmm, we didn"t get a clear indication... Let"s assume XSD,
        // since apparently no DTD declaration has been found up until
        // detection stopped (before finding the document"s root tag).
        return VALIDATION_XSD;
    }

 方法的实现其实还是很简单的,无非是如果设定了验证模式则使用设定的验证模式,否则使用自动的验证模式,自检测验证模式的功能相对来说比较简单,这里就不再多说了。

3.    获取Document

经过了验证模式准备的步骤就可以进行Document加载了,同样XmlBeanDefinitionReader对于文档的读取并没有亲力亲为,而是委托给了DocumentLoader去执行,解析代码如下(DefaultDocumentLoader中)

   public Document loadDocument(InputSource inputSource, EntityResolver entityResolver,
           ErrorHandler errorHandler, int validationMode, boolean namespaceAware) throws Exception {
 
        DocumentBuilderFactory factory = createDocumentBuilderFactory(validationMode, namespaceAware);
        if (logger.isDebugEnabled()) {
           logger.debug("Using JAXP provider [" + factory.getClass().getName() + "]");
        }
        DocumentBuilder builder = createDocumentBuilder(factory, entityResolver, errorHandler);
        return builder.parse(inputSource);
    }

 对于这部分代码其实并没有太多可以描述的,因为通过SAX解析XML文档的套路大致都差不多,Spring在这里并没有什么特殊的地方,同样首先创建DocumentBuilderFactory再通过DocumentBuilderFactory创建DocumentBuilder,进而解析inputSource来返回Document对象。

4.    解析及注册BeanDefinitions

  把文件转换成Document之后,接下来就可以提取及注册bean了。

  public int registerBeanDefinitions(Document doc, Resource resource) throws BeanDefinitionStoreException {
        //使用DefaultBeanDefinitionDocumentReader实例化BeanDefinitionDocumentReader
        BeanDefinitionDocumentReader documentReader = createBeanDefinitionDocumentReader();
// 在实例化BeanDefinitionReader时候会将BeanDefinitionRegistry传入,默认使用继承自DefaultListableBeanFactory的子类
        // 记录统计前BeanDefinition的加载个数
        int countBefore = getRegistry().getBeanDefinitionCount();
        // 加载及注册bean
        documentReader.registerBeanDefinitions(doc, createReaderContext(resource));
        // 记录本次加载的BeanDefinition个数
        return getRegistry().getBeanDefinitionCount() - countBefore;
    }

   进入DefaultBeanDefinitionDocumentReader的registerBeanDefinitions方法

   public void registerBeanDefinitions(Document doc, XmlReaderContext readerContext) {
        this.readerContext = readerContext;
        logger.debug("Loading bean definitions");
        Element root = doc.getDocumentElement();
        doRegisterBeanDefinitions(root);
    }

 下面进入核心逻辑的底部doRegisterBeanDefinitions(root)方法

  protected void doRegisterBeanDefinitions(Element root) {
        // 专门处理解析
        BeanDefinitionParserDelegate parent = this.delegate;
        this.delegate = createDelegate(getReaderContext(), root, parent);
 
        if (this.delegate.isDefaultNamespace(root)) {
            // 处理profile属性
           String profileSpec = root.getAttribute(PROFILE_ATTRIBUTE);
           if (StringUtils.hasText(profileSpec)) {
               String[] specifiedProfiles = StringUtils.tokenizeToStringArray(
                       profileSpec, BeanDefinitionParserDelegate.MULTI_VALUE_ATTRIBUTE_DELIMITERS);
               if (!getReaderContext().getEnvironment().acceptsProfiles(specifiedProfiles)) {
                   if (logger.isInfoEnabled()) {
                       logger.info("Skipped XML bean definition file due to specified profiles [" + profileSpec +
                               "] not matching: " + getReaderContext().getResource());
                   }
                   return;
               }
           }
        }
 
        // 解析前处理,留给子类实现
        preProcessXml(root);
        parseBeanDefinitions(root, this.delegate);
        // 解析后处理,留给子类实现
        postProcessXml(root);
 
        this.delegate = parent;
    }

 

4.1profile属性的使用

这个特性可以同时在配置文件中部署两套配置来适用于生产环境和开发环境,这样可以方便的进行切换开发、部署环境,最常用的是更换不同的数据库。

4.2解析并注册BeanDefinitions

处理了profile后就可以进行XML的读取了,跟踪代码进入parseBeanDefinitions(root, this.delegate)

   protected void parseBeanDefinitions(Element root, BeanDefinitionParserDelegate delegate) {
         // 对beans的处理
        if (delegate.isDefaultNamespace(root)) {
           NodeList nl = root.getChildNodes();
           for (int i = 0; i < nl.getLength(); i++) {
               Node node = nl.item(i);
               if (node instanceof Element) {
                   Element ele = (Element) node;
                   if (delegate.isDefaultNamespace(ele)) {
                         // 对bean的处理
                       parseDefaultElement(ele, delegate);
                   }
                   else {
                         // 对bean的处理
                       delegate.parseCustomElement(ele);
                   }
               }
           }
        }
        else {
           delegate.parseCustomElement(root);
        }
    }

 

上面的代码看起来逻辑还是挺清晰的,因为在spring的xml配置里面有两大类bean申明,一个是默认的,一个是自定义的,两种方式的读取及解析差别还是非常大的,如果采用Spring默认的配置,spring当然知道该怎么做,但是如果是自定义的,那么久需要用户实现一些接口及配置了。

对于标签解析,请看我下一篇文章。

当前文章:http://peakfog.com/R/24273.html

发布时间:2019-03-20 00:35:10

联众打码平台网址 适合山区农村做的生意 gta5淘宝刷钱会封号吗 百家号一天赚200 大学生兼职创业计划书 引流做好了怎么能赚钱 员工上下班回家签到表 在家秀十字秀能赚钱吗

网赚江苏快三 试用賺 关注公众号广告词宣传 推广包赚钱 网上赚钱论坛有哪些 赚钱软件一元提现微信 蜜源佣金比花生日记高 帝豪网络赚盟 手机截图赚钱的平台 上海早上配送兼职 淘宝开店成本预算 挂机赚钱的软件 青岛网站seo多少钱 淘宝联盟批量推广 网络优化公司推广系统 网易新闻广告推广 下班回家怎么关心 用一台笔记本怎么赚钱 做兼职滴滴专车司机

编辑:扁成

 
分享到: 更多
作品集
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
栏目列表
推荐文章
  • 加纳老师在黑板上画出Word界面,微软将向该学校捐赠电脑

    “老李,你也都看到了,马三又来闹事,即便厚着我们几个老脸去马家说和未必能成。”...

  • 在韩外国留学生增加 多数为亚洲国家短期语言生

    唐三点了点头,但他还是忍不住问道:“老师,这块魂骨的作用究竟是什么?”...

  • 浙江成立首个大学生旅游联盟

    云向南向法宝与归难奉上一个三敬礼,先回法宝问话:「感谢圣尼关心!」然后转头对归难说:「输烟特使、归大师,我们这次带『长生门』掌门仇天恨来这里,为的就是向『天鹰盟』效忠示诚,一直以来,外界错以为春东与中土『大风会』关系甚密,我们此举就是要打破外界谣传,事实上,田兄与我等春东侠界绝无可能视『西疆圣教』为邪魔外道,更不可能与『大风会』连手,做出任何不利『天鹰盟』之事!」...

  • 广西出台旅游厕所建设管理新三年行动计划

    “应该的,应该的,你也是狩人的一员啊。”正在艰难的做着俯卧撑的威尔等人立刻欢喜的大叫道,大家以后都是一队的,必须是要有福同享有难同当的。...

  • “神奇女侠”向“超女”求婚:粉丝尖叫黑武士看呆

    虽然叶扬正在尽量避免使用魔刀,但是这魔刀似乎是随着它的复苏力量也会变得更加强大,即便是平时不用,那变得强大的魔刀也会是自己的底牌。...

  • 《Dota2》新赛季11月22日上线,V社重新定义两周

    那在唐三脑海中响起的威严声音说到最后,声音已经变得虚无缥缈,但唐三却肃然起敬,不用问他也明白,不论是那金色虚影还是这威严的声音,都来自于真正的海神,或者说是海神留在这个世界的烙印,自己也终于第一次窥视到了神技的门径。...