array(2) { ["docs"]=> array(10) { [0]=> array(10) { ["id"]=> string(3) "428" ["text"]=> string(77) "Visual Studio 2017 单独启动MSDN帮助(Microsoft Help Viewer)的方法" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(8) "DonetRen" ["tagsname"]=> string(55) "Visual Studio 2017|MSDN帮助|C#程序|.NET|Help Viewer" ["tagsid"]=> string(23) "[401,402,403,"300",404]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400964" ["_id"]=> string(3) "428" } [1]=> array(10) { ["id"]=> string(3) "427" ["text"]=> string(42) "npm -v;报错 cannot find module "wrapp"" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "zzty" ["tagsname"]=> string(50) "node.js|npm|cannot find module "wrapp“|node" ["tagsid"]=> string(19) "[398,"239",399,400]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400760" ["_id"]=> string(3) "427" } [2]=> array(10) { ["id"]=> string(3) "426" ["text"]=> string(54) "说说css中pt、px、em、rem都扮演了什么角色" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(12) "zhengqiaoyin" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400640" ["_id"]=> string(3) "426" } [3]=> array(10) { ["id"]=> string(3) "425" ["text"]=> string(83) "深入学习JS执行--创建执行上下文(变量对象,作用域链,this)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "Ry-yuan" ["tagsname"]=> string(33) "Javascript|Javascript执行过程" ["tagsid"]=> string(13) "["169","191"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511399901" ["_id"]=> string(3) "425" } [4]=> array(10) { ["id"]=> string(3) "424" ["text"]=> string(30) "C# 排序技术研究与对比" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "vveiliang" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(8) ".Net Dev" ["catesid"]=> string(5) "[199]" ["createtime"]=> string(10) "1511399150" ["_id"]=> string(3) "424" } [5]=> array(10) { ["id"]=> string(3) "423" ["text"]=> string(72) "【算法】小白的算法笔记:快速排序算法的编码和优化" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "penghuwan" ["tagsname"]=> string(6) "算法" ["tagsid"]=> string(7) "["344"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511398109" ["_id"]=> string(3) "423" } [6]=> array(10) { ["id"]=> string(3) "422" ["text"]=> string(64) "JavaScript数据可视化编程学习(二)Flotr2,雷达图" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "chengxs" ["tagsname"]=> string(28) "数据可视化|前端学习" ["tagsid"]=> string(9) "[396,397]" ["catesname"]=> string(18) "前端基本知识" ["catesid"]=> string(5) "[198]" ["createtime"]=> string(10) "1511397800" ["_id"]=> string(3) "422" } [7]=> array(10) { ["id"]=> string(3) "421" ["text"]=> string(36) "C#表达式目录树(Expression)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "wwym" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(4) ".NET" ["catesid"]=> string(7) "["119"]" ["createtime"]=> string(10) "1511397474" ["_id"]=> string(3) "421" } [8]=> array(10) { ["id"]=> string(3) "420" ["text"]=> string(47) "数据结构 队列_队列实例:事件处理" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "idreamo" ["tagsname"]=> string(40) "C语言|数据结构|队列|事件处理" ["tagsid"]=> string(23) "["246","247","248",395]" ["catesname"]=> string(12) "数据结构" ["catesid"]=> string(7) "["133"]" ["createtime"]=> string(10) "1511397279" ["_id"]=> string(3) "420" } [9]=> array(10) { ["id"]=> string(3) "419" ["text"]=> string(47) "久等了,博客园官方Android客户端发布" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(3) "cmt" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511396549" ["_id"]=> string(3) "419" } } ["count"]=> int(200) } 222 spring容器源码 - 爱码网

项目中用到

Object object = applicationContext.getBean(name)

在Spring中,所有的Bean都是由BeanFactory(也就是IOC容器)来进行管理的。

BeanFacotry

The root interface for accessing a Spring bean container.This is the basic client view of a bean container.

源码注释:用于访问Spring bean容器的根接口。这是bean容器的基本客户端视图
BeanFactory无法支持spring的许多插件,如AOP功能、Web应用等。
BeanFactory接口方法如下图
spring容器源码

ApplicationContext

ApplicationContext是BeanFactory子接口
ApplicationContext以一种更向面向框架的方式工作以及对上下文进行分层和实现继承

Central interface to provide configuration for an application.

源码注释:用于为应用程序提供配置的中央接口。

BeanFacotry和ApplicationContext继承关系

spring容器源码

BeanDefinition

A BeanDefinition describes a bean instance, which has property values,
 constructor argument values, and further information supplied by
 concrete implementations.
 BeanDefinition描述了一个bean实例,它具有属性值,
  构造函数参数值,要是提供的更多信息需
  具体实现。

BeanDefinitionRegistry

Interface for registries that hold bean definitions, for example RootBeanDefinition
 and ChildBeanDefinition instances. Typically implemented by BeanFactories that
 internally work with the AbstractBeanDefinition hierarchy.
 
 <p>This is the only interface in Spring's bean factory packages that encapsulates
 <i>registration</i> of bean definitions. The standard BeanFactory interfaces
 only cover access to a <i>fully configured factory instance</i>.
 
 <p>Spring's bean definition readers expect to work on an implementation of this
 interface. Known implementors within the Spring core are DefaultListableBeanFactory
 and GenericApplicationContext.
 包含bean定义的注册表的接口,例如RootBeanDefinition
  和ChildBeanDefinition实例。 通常由BeanFactories实现
  内部使用AbstractBeanDefinition层次结构。
 
  <p>这是Spring封装的bean工厂包中唯一的接口
  <i>注册</ i> bean定义。 标准的BeanFactory接口
  仅涵盖对<i>完全配置的工厂实例</ i>的访问权限。
 
  <p> Spring的bean定义读者希望能够实现这一点
  界面。 Spring core中的已知实现者是DefaultListableBeanFactory
  和GenericApplicationContext。

DefaultListableBeanFactory

interfaces: a full-fledged bean factory
 based on bean definition objects.
  <p>Typical usage is registering all bean definitions first (possibly read
 from a bean definition file), before accessing beans. Bean definition lookup
 is therefore an inexpensive operation in a local bean definition table,
 operating on pre-built bean definition metadata objects.
 
 <p>Can be used as a standalone bean factory, or as a superclass for custom
 bean factories. Note that readers for specific bean definition formats are
 typically implemented separately rather than as bean factory subclasses:
 see for example {@link PropertiesBeanDefinitionReader} and
 {@link org.springframework.beans.factory.xml.XmlBeanDefinitionReader}.
接口:一个成熟的bean工厂
  基于bean定义对象。
   <p>典型用法是首先注册所有bean定义(可能已读取
  访问bean之前,来自bean定义文件)。 Bean定义查找
  因此在本地bean定义表中是一个轻量的操作,
  在预构建的bean定义元数据对象上运行。
 
  <p>可以用作独立的bean工厂,也可以用作自定义的超类
  bean工厂。 请注意,特定bean定义格式的readers是
  通常单独实现,而不是作为bean工厂子类实现:
  参见例如{@link PropertiesBeanDefinitionReader}{@link org.springframework.beans.factory.xml.XmlBeanDefinitionReader}

总结

配置文件解析为BeanDefinition对象,被注册到了 DefaultListableBeanFactory(实现BeanDefinitionRegistry接口), 保存在beanDefinitionMap(ConcurrentHashMap)。
GenericApplicationContext 是ApplicationContext实现类,有final的DefaultListableBeanFactory成员变量,最终取到beanDefinitionMap中的bean。

spring容器源码
spring全文:https://www.jianshu.com/p/619fe7164afb?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation
spring容器文:https://www.cnblogs.com/digdeep/p/4518571.html
spring源码深度解析—容器的基本实现:https://blog.csdn.net/uftjtt/article/details/79896110

相关文章: