决战梭哈棋牌APP下载_决战梭哈棋牌官网 - 由决战梭哈棋牌APP下载,决战梭哈棋牌官网社主办的《决战梭哈棋牌APP下载,决战梭哈棋牌官网》是我国消费领域中一张全国性、全方位、大容量的综合性日报。其立足消费网投领域,依托轻工行业,面向城乡市场,最先发布相关的专业权威资讯。

Spring源码剖析2:Spring IOC容器的加载过程

  • 时间:
  • 浏览:0

还是重载最好的方式,不过这里对传进来的Resource又进行了一次封装,变成了编码后的Resource。

这人 最好的方式又调用了重载最好的方式

这里要说明一下,ApplicationContext实现了BeanFactory接口,并实现了ResourceLoader、MessageSource等接口,要能认为是增强的BeanFactory。这人 这人 ApplicationContext何必 此人 重复实现BeanFactory定义的最好的方式,这人 这人 委托给DefaultListableBeanFactory来实现。这人 设计思路也是值得学习的。

里边的 prepareBeanFactory()、postProcessBeanFactory()、invokeBeanFactoryPostProcessors()、registerBeanPostProcessors()、initMessageSource()、initApplicationEventMulticaster()、onRefresh()、registerListeners()、finishBeanFactoryInitialization()、finishRefresh()等最好的方式,是换成这人 后除理器、广播、拦截器等,就不有4个多多个细说了

持续单步调试,代码继续运行到DefaultBeanDefinitionDocumentReader中的processBeanDefinition中的registerBeanDefinition()

这段代码,创建了有4个多多BeanDefinitionParserDelegate组件,这人 这人 这人 这人 preProcessXml()、parseBeanDefinitions()、postProcessXml()最好的方式

其中preProcessXml()和postProcessXml()默认是空最好的方式,接下来就看下parseBeanDefinitions()最好的方式

Resource也是有4个多多接口体系,在web环境下,这里这人 这人 ServletContextResource

这第一要素,是除理应用线程池池相关的工作,把当前正在解析的Resource,设置为当前Resource。

3.定义业务逻辑接口UserService.java

链接:https://www.jianshu.com/p/963f87a5c4d7

首先是prepareRefresh()最好的方式

这人 最好的方式也比较长,拆开来看

前者是把beanName放进去队列里,后者是把BeanDefinition放进去map中,到此注册就完成了。在里边实例化的完后 ,这人 这人 把beanDefinitionMap中的BeanDefinition取出来,逐一实例化

BeanFactory准备完毕完后 ,代码又回到了ClassPathXmlApplicationContext里

最后,这人 这人 核心的loadBeanDefinitions()最好的方式

1.顶层接口:ApplicationContext

2.ClassPathXmlApplicationContext实现类继承AbstractXmlApplication 抽象类

3.AbstractXmlApplication 继承AbstractRefreshableConfigApplicationContext

4.AbstractRefreshableConfigApplicationContext抽象类继承AbstractRefreshableApplicationContext

5.AbstractRefreshableApplicationContext 继承 AbstractApplicationContext

6.AbstractApplicationContext 实现ConfigurableApplicationContext 接口

7.ConfigurableApplicationContext 接口继承

ApplicationContext接口

总体来说继承实现形状较深,外部使用了几滴 适配器模式。

以ClassPathXmlApplicationContext为例,继承类图如下图所示:

BeanDefinition的解析,愿因 走到了DefaultBeanDefinitionDocumentR

eader里,这完后 配置文件愿因 被加载,并解析成w3c的Document对象。这篇博客就接着介绍,DefaultBeanDefinitionDocumentReader和BeanDefinitionParserDelegate类,是为甚在么在协同完成bean的解析和注册的。

在要是开始完后 ,先介绍有4个多多整体的概念。即spring ioc容器的加载,大体上经过以下好多个过程:

资源文件定位、解析、注册、实例化

这里要说明一下,ApplicationContext何必 此人 负责配置文件的加载、解析、注册,这人 这人 将哪好多个工作委托给XmlBeanDefinitionReader来做。

这里注意两点 :

这人 这人 允许用户进行这人 自定义的配置

也都有核心的obtainFreshBeanFactory()最好的方式,这人 最好的方式是初始化BeanFactory,是整个refresh()最好的方式的核心,其中完成了配置文件的加载、解析、注册,里边会专门完全说 。

抛开异常除理:核心代码如下:

也这人 这人 obtainFreshBeanFactory()最好的方式执行完后 ,再进行下面的步骤。

总结来说,ApplicationContext将解析配置文件的工作委托给BeanDefinitionReader,这人 这人 BeanDefinitionReader将配置文件读取为xml的Document文档完后 ,又委托给BeanDefinitionDocumentReader

BeanDefinitionDocumentReader这人 组件是根据xml元素的命名空间和元素名,起到有4个多多路由的作用,实际的解析工作,是委托给BeanDefinitionParserDelegate来完成的

BeanDefinitionParserDelegate的解析工作完成完后 ,会返回BeanDefinitionHolder给BeanDefinitionDocumentReader,在这里,会委托给DefaultListableBeanFactory完成bean的注册

XmlBeanDefinitionReader(计数、解析XML文档),BeanDefinitionDocumentReader(依赖xml文档,进行解析和注册),BeanDefinitionParserDelegate(实际的解析工作)。要能看出,在解析bean的过程中,这兩个组件的分工是比较清晰的,各司其职,这人 设计思想值得学习

到此为止,bean的解析、注册、spring ioc 容器的实例化过程就基本分析要是开始了。

首先这人 最好的方式是同步的,以除理重复刷新。这人 这人 刷新的每个步骤,都放进去单独的最好的方式里,比较清晰,要能按顺序有4个多多个看

这里每个最好的方式的命名,这人 这人 明了是要干哪好多个,要能有4个多多个跟进去看,本文就不细说了。总之,经过这里的解析,就得到了有4个多多完全的BeanDefinitionHolder。这人 这人 说明一下,愿因 在配置文件里,那么对这人 属性进行设置,比如autowire-candidate等,那么这人 解析生成的BeanDefinition,都有得到有4个多多默认值

这人 这人 ,对这人 Bean做这人 必要的装饰

这人 这人 这里创建了BeanDefinitionParserDelegate对象,preProcessXml()和postProcessXml()都有空最好的方式,核心这人 这人 parseBeanDefinitions()最好的方式。这里又把BeanDefinition解析和注册的工作,委托给了BeanDefinitionParserDelegate对象,在parseBeanDefinitions()最好的方式中完成

总的来说,解析工作的委托链是从前的:ClassPathXmlApplicationContext,XmlBeanDefinitionReader,DefaultBeanDefinitionDocumentReader,BeanDefinitionParserDelegate

ClassPathXmlApplicationContext作为最外围的组件,发起解析的请求

XmlBeanDefinitionReader将配置文件路径封装为Resource,读取出w3c定义的Document对象,这人 这人 委托给DefaultBeanDefinitionDocumentReader

DefaultBeanDefinitionDocumentReader就要是开始做实际的解析工作了,这人 这人 涉及到bean的具体解析,它还是会继续委托给BeanDefinitionParserDelegate来做。

接下来在parseBeanDefinitions()最好的方式中占据 了哪好多个,以及BeanDefinitionParserDelegate类完成的工作,在下一篇博客中继续介绍。

1.Document对象

首先这人 Document对象,是W3C定义的标准XML对象,跟spring无关。其次这人 registerBeanDefinitions最好的方式,我确实命名很重误导性。愿因 这人 完后 实际上解析还那么要是开始,为甚在么在直接就注册了呢。比较好的命名,我确实要能是parseAndRegisterBeanDefinitions()。

2.documentReader的创建时使用反射创建的,代码如下

这人 最好的方式做了2件事,首先通过refreshBeanFactory()最好的方式,创建了DefaultListableBeanFactory的实例,并进行初始化。

每个栈帧中最好的方式的行号都有标明,按照行号追溯源码,这人 这人 配合教程要能快速学习。

ioc容器实例化代码

要能了http://www.springframework.org/schema/beans,会被认为是默认的命名空间。也这人 这人 说,beans、bean哪好多个元素,会认为属于默认的命名空间,而像task:scheduled哪好多个,就认为不属于默认命名空间。

根节点beans的有4个多多子节点bean,是属于默认命名空间的,这人 这人 会进入parseDefaultElement()最好的方式

这人 段,主这人 这人 除理这人 跟alias,id等标识相关的东西

这人 行是核心,进行实际的解析

2.定义IUserDao.java实现类IUserDaoImpl.java

这里就何必 了,这人 这人 把每有4个多多Resource作为参数,继续调用重载最好的方式。读spring源码,会发现重载最好的方式很重多。

注册也完成完后 ,在BeanFactory的getBean()最好的方式之中,会完成初始化,也这人 这人 依赖注入的过程

大体上的流程这人 这人 从前。

这里愿因 会有4种情形,import、alias、bean、beans,分别有有4个多多最好的方式与之对应,这里解析的是bean元素,这人 这人 会进入processBeanDefinition()最好的方式

來源:简书

1.目标:

这篇记录debug 追溯源码的过程,至少分有4个多多篇幅,这是第一篇,现整体了解一下运行流程,定位资源加载,资源解析,bean 注册占据 的位置。

2.记录形状:

1.调试栈截图

2.整体流程

3.bean.xml的除理

要素代码下面有相应的讲解

接下来设置ID唯一标识

4.定义UserService.java实现类UserServiceImpl.java

1.目标:熟练使用spring,并分析其源码,了解其中的思想。这篇主要介绍spring ioc 容器的加载

2.前提条件:会使用debug

3.源码分析最好的方式:Intellj idea debug 模式下源码追溯

通过ClassPathXmlApplicationContext 进行xml 件的读取,从每个堆栈中读取应用线程池池的运行信息

4.注意:愿因 Spring的类继承体系比较冗杂,要能了完全贴图,这人 这人 只将分析源码完后 发现的最主要的类继承形状类图贴在下方。

5.关于Spring Ioc Demo:大伙儿儿从demo入手一步步进行代码追溯。

代码追溯完后 发现这人 最好的方式里,最关键的是以下2行:

1.资源文件定位

其中资源文件定位,一般是在ApplicationContext的实现类里完成的,愿因 ApplicationContext接口继承ResourcePatternResolver 接口,ResourcePatternResolver接口继承ResourceLoader接口,ResourceLoader其中的getResource()最好的方式,要能将外部的资源,读取为Resource类。

从这人 最好的方式要是开始,BeanDefinitionParserDelegate就要是开始发挥作用了,判断当前解析元素与非 属于默认的命名空间,愿因 是的话,就调用parseDefaultElement()最好的方式,这人 这人 调用delegate上parseCustomElement()最好的方式

instantiateClass最好的方式中传入了有4个多多Class类型的参数。追溯发现下述代码:

首先愿因 愿因 有BeanFactory实例,就先清空。这人 这人 通过createBeanFactory()最好的方式,创建有4个多多DefaultListableBeanFactory的实例

而这里的ResourceLoader,这人 这人 前面的XmlWebApplicationContext,愿因 ApplicationContext接口,是继承自ResourceLoader接口的

>2.BeanDefinitionRegistry接口

首先getResourceLoader()的实现的前提条件愿因 XmlBeanDefinitionReader在实例化的完后 愿因 选折 了创建了实例ResourceLoader实例, 代码占据 AbstractBeanDefinitionReader

2.解析DefaultBeanDefinitionDocumentReader,

解析主这人 这人 在BeanDefinitionReader中完成的,最常用的实现类是XmlBeanDefinitionReader,其中的loadBeanDefinitions()最好的方式,负责读取Resource,并完成后续的步骤。ApplicationContext完成资源文件定位完后 ,是将解析工作委托给XmlBeanDefinitionReader来完成的

解析这里涉及到这人 这人 步骤,最常见的情形,资源文件来自有4个多多XML配置文件。首先是BeanDefinitionReader,将XML文件读取成w3c的Document文档。

DefaultBeanDefinitionDocumentReader对Document进行进一步解析。这人 这人 DefaultBeanDefinitionDocumentReader又委托给BeanDefinitionParserDelegate进行解析。愿因 是标准的xml namespace元素,会在Delegate外部完成解析,愿因 是非标准的xml namespace元素,则会委托至少的NamespaceHandler进行解析最终解析的结果都封装为BeanDefinitionHolder,至此解析就算完成。

后续会进行细致讲解。

这段是后置除理,对beanName进行除理

前置除理和后置除理,都有核心,就不细就看,重点看下核心的那一行调用

进入代码中一步步追溯,发现重要最好的方式:refresh();

如下所示:

除理完外围事务完后 ,进入doRegisterBeanDefinitions()最好的方式,这人 命名规范,上文愿因 介绍过了

愿因 配置文件中元素,配有profile属性,就会进入这人 段,不过一般都有不想的

4.实例化

这是解析过程最外围的代码,首那么获取到配置文件的路径,这在完后 愿因 完成了。

这人 这人 将每个配置文件的路径,作为参数传给BeanDefinitionReader的loadBeanDefinitions最好的方式里

bean.xml配置文件

这里首先会创建有4个多多XmlBeanDefinitionReader的实例,这人 这人 进行初始化。这人 XmlBeanDefinitionReader中确实传递的BeanDefinitionRegistry类型的实例,为哪好多个要能传递有4个多多beanFactory呢,愿因 DefaultListableBeanFactory实现了BeanDefinitionRegistry接口,这里是多态的使用。

这段是从配置中抽取出类名。接下来的长长一段,把异常除理先抛开,看看实际的业务

单步进入代码发现BeanDefinitionReaderUtils静态最好的方式registerBeanDefinition()

这人 最好的方式里做的事情太少,记录了要是开始时间,输出日志,另外initPropertySources()最好的方式和validateRequiredProperties()最好的方式一般都那么做哪好多个事。

这人 这人 这人 loadBeanDefinitions()的最后有4个多多重载最好的方式,比较长,要能拆看来看。

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

接下来进入重载最好的方式loadBeanDefinitions()

其中的关键最好的方式是finishBeanFactoryInitialization(),在这人 最好的方式中,会对刚才注册的Bean(不延迟加载的),进行实例化,这人 这人 也是有4个多多核心最好的方式。

微信公众号【Java技术江湖】一位阿里 Java 工程师的技术小站。(关注公众号后回复”Java“即可领取 Java基础、进阶、项目和架构师等免费学习资料,更有数据库、分布式、微服务等热门技术学习视频,内容丰富,兼顾原理和实践,另外也将赠送作者原创的Java学习指南、Java应用线程池池员面试指南等干货资源)

解释一下确实调用的是DefaultListableBeanFactory中的registerBeanDefinition最好的方式这句话,愿因 DefaultListableBeanFactory实现BeanDefinitionRegistry接口,BeanDefinitionRegistry接口中定义了registerBeanDefinition()最好的方式

看下DefaultListableBeanFactory中registerBeanDefinition()实例最好的方式的具体实现:

这人 这人 创建的documentReaderClass是DefaultBeanDefinitionDocumentReader类的实例。

接下来就进入BeanDefinitionDocumentReader 中定义的registerBeanDefinitions()最好的方式看看

从整体上介绍完了流程,接下来就重点看obtainFreshBeanFactory()最好的方式,上文说到,在这人 最好的方式里,完成了配置文件的加载、解析、注册

入口是loadBeanDefinitions最好的方式

这人 最好的方式很长,要能分成三段来看

这人 最好的方式比较长,BeanDefinitionReader要能了直接加载配置文件,须要把配置文件封装成Resource,这人 这人 要能调用重载最好的方式loadBeanDefinitions()。这人 这人 这人 最好的方式确实这人 这人 2段,第一要素是委托ResourceLoader将配置文件封装成Resource,第二要素是调用loadBeanDefinitions(),对Resource进行解析

这人 最好的方式也挺长的,拆开看看

这里是第二要素,是核心,首先把Resource还原为InputStream,这人 这人 调用实际解析的最好的方式doLoadBeanDefinitions()。要能就看,这人 命名最好的方式是很值得学习的,并都有业务最好的方式,比如parse(),愿因 须要做这人 外围的工作,这人 这人 实际解析的最好的方式,要能命名为doParse()。这人 doXXX()的命名最好的方式,在这人 这人 开源框架中都有应用,比如logback等。

接下来就看一下这人 doLoadBeanDefinitions()最好的方式

接下来就看一下这人 核心最好的方式registerBeanDefinitions

1.定义数据访问接口IUserDao.java

这里主要有兩个步骤,先是委托delegate对bean进行解析,这人 这人 委托delegate对bean进行装饰,最后由有4个多多工具类来完成BeanDefinition的注册

要能看出来,DefaultBeanDefinitionDocumentReader不负责任何具体的bean解析,它面向的是xml Document对象,根据其元素的命名空间和名称,起有4个多多类似路由的作用(不过,命名空间的判断,也是委托给delegate来做的)。这人 这人 这人 类的命名,是比较贴切的,突出了其面向Document的形状。具体的工作,是由BeanDefinitionParserDelegate来完成的

下面就看下parseBeanDefinitionElement()最好的方式

doLoadDocument最好的方式将InputStream读取成标准的Document对象,这人 这人 调用registerBeanDefinitions(),进行解析工作。

3.注册

这人 这人 bean的注册是在BeanFactory里完成的,BeanFactory接口最常见的有4个多多实现类是DefaultListableBeanFactory,它实现了BeanDefinitionRegistry接口,这人 这人 其中的registerBeanDefinition()最好的方式,要能对BeanDefinition进行注册这里附带一提,最常见的XmlWebApplicationContext都有此人 持有BeanDefinition的,它继承自AbstractRefreshableApplicationContext,其持有有4个多多DefaultListableBeanFactory的字段,这人 这人 用它来保存BeanDefinition

所谓的注册,确实这人 这人 将BeanDefinition的name和实例,保存到有4个多多Map中。刚才说到,最常用的实现DefaultListableBeanFactory,其中的字段这人 这人 beanDefinitionMap,是有4个多多ConcurrentHashMap。

代码如下:

>1.DefaultListableBeanFactory继承实现关系

这行代码,这人 这人 Bean定义读取实际占据 的地方。这里的工作,主这人 这人 XmlBeanDefinitionReader来完成的,下一篇博客会完全介绍这人 过程。

作者:fxliutao