0%

从上篇文章中我们可以得知,如果从单例缓存中没有获取到单例bean,则会说明是下面俩种情况发生:

  1. 该bean的scope是singleton ,但是没有初始化完成
  2. 该bean的scope不是singleton

本篇文章就来进行这部分的分析,这里先讲循环依赖检测、parentBeanFactory与依赖处理,剩下的scope处理,主要在下一篇文章中讲解。

阅读全文 »

从这篇博客开始我们开始加载bean的第一个步骤,从缓存中获取bean,代码片段如下:

1
2
3
4
5
6
7
8
9
10
11
12
Object sharedInstance = getSingleton(beanName);
if (sharedInstance != null && args == null) {
if (logger.isDebugEnabled()) {
if (isSingletonCurrentlyInCreation(beanName)) {
。。省略日志
}
else {
。。。省略日志
}
}
bean = getObjectForBeanInstance(sharedInstance, name, beanName, null);
}

首先调用getSingleton()从缓存中获取单例bean,在上篇博客提到过,Spring对单例模式的bean只会创建一次,后续如果再获取该bean则是直接从单例缓存中获取,该过程就体现在getSingleton()中。如下:

阅读全文 »

概述

  1. spring Ioc功能简介
  2. spring 获取bean流程及源码分析

spring Ioc功能简介

upload successful
(此图来自《Spring 揭秘》)

Spring IOC 容器所起的作用如上图所示,它会以某种方式加载Configuration Metadata,将其解析注册到容器内部,然后回根据这些信息绑定整个系统的对象,最终组装成一个可用的基于轻量级容器的应用系统。

Spring在实现上述功能中,将整个流程分为两个阶段:容器初始化阶段和加载bean阶段。

阅读全文 »

spring源码解析之 15BeanDefinition解析总结

前面 13 篇博文从源码层次分析了 IOC 整个初始化过程,这篇就这些内容做一个总结将其连贯起来。

在前文提过,IOC 容器的初始化过程分为三步骤:Resource 定位、BeanDefinition的解析,BeanDefinition 注册。

阅读全文 »

spring源码解析之 13自定义标签解析

概述

  1. 自定义标签简介
  2. 源码分析

自定义标签简介

在之前的分析中,我们提到了在Spring中存在默认标签与自定义标签俩种,而在上一章节中我们分析了Spring中对默认标签的解析过程。但是遗留了一个问题,就是对自定义标签的解析。这里先回顾当完成从配置文件到Document的转换并提取对应的root后,就开始了所有元素的解析,而在这一过程中便开始了默认标签和自定义标签俩种格式的区分,代码如下:

阅读全文 »

概述

  1. alias标签解析
  2. import标签解析
  3. 嵌入式beans标签解析

通过前面较长的篇幅我们终于完成了默认标签中对bean标签的处理,那么我们之前提到过,对配置文件的解析包括对import标签,alias标签、bean标签的处理,而这三个的解析也是围绕着bean标签。下面我们先来看alias标签的解析。

在bean进行定义时,除了使用id属性来制定名称之外,为了提供多个名称,可以使用alias标签来指定,而所有的这些名称都指向统一bean,在某些情况下提供别名非常有用,比如为了让应用的 每一个组件都能更容易地对公共组件进行引用。

阅读全文 »