`
JackyCheng2007
  • 浏览: 253303 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Spring 源码学习 - ClassPathXmlApplicationContext

阅读更多
众所周知,Spring以其强大而又灵活的IoC管理功能著称。IoC本质上是通过依赖注入DI的方式实现组件之间的解耦。其实在DI模式下,一个关键性的角色是装配器(assembler)。应用程序的组件A在引用别的组件B的时候不用通过new来创建,而是依赖一个第三方的装配器创建好B,然后再通过setter或者constructor来注入给A,这样A只管用B的接口,而不需要知道B的存在,从而实现了A与B的解耦。也实现了面向抽象(接口)编程。

Spring框架里面谁来充当这个assembler的角色呢?是BeanFactory。Spring提供了品种繁多的BeanFactory,共用户在不同场合下使用。我们通常更多的是使用它的子接口ApplicationContext。大致上分了三类:Java Application,Web Application 和 Portlet Application。

本文通过一个简单的例子(http://svn.springbyexample.org/core/basic-dependency-injection/)来看看ClassPathXmlApplicationContext的调用和执行顺序图(用MaintainJ生成的):



上图的init代表执行构造函数。上图表达了下面这句话:
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("/application-context.xml");

再看看类图:



再细致的看下去,分解StandardEnvironment的构建过程(可以看出是解析各种属性的过程):



属性都load好了,环境也构建好了,那么Bean的实例在哪里创建的呢?关键得看DefaultListableBeanFactory:



这里面关键是看registerSingleton函数,它负责把bean缓存到singletonObjects (private final Map<String, Object> singletonObjects = new ConcurrentHashMap<String, Object>();)
public void registerSingleton(String beanName, Object singletonObject) throws IllegalStateException {
		Assert.notNull(beanName, "'beanName' must not be null");
		synchronized (this.singletonObjects) {
			Object oldObject = this.singletonObjects.get(beanName);
			if (oldObject != null) {
				throw new IllegalStateException("Could not register object [" + singletonObject +
						"] under bean name '" + beanName + "': there is already object [" + oldObject + "] bound");
			}
			addSingleton(beanName, singletonObject);
		}
	}

	/**
	 * Add the given singleton object to the singleton cache of this factory.
	 * <p>To be called for eager registration of singletons.
	 * @param beanName the name of the bean
	 * @param singletonObject the singleton object
	 */
	protected void addSingleton(String beanName, Object singletonObject) {
		synchronized (this.singletonObjects) {
			this.singletonObjects.put(beanName, (singletonObject != null ? singletonObject : NULL_OBJECT));
			this.singletonFactories.remove(beanName);
			this.earlySingletonObjects.remove(beanName);
			this.registeredSingletons.add(beanName);
		}
	}

从上面的逻辑上可以看出,同名的类是不能被缓存进去的,会抛出异常。
好了,后的程序想getBean的时候只需要从这个缓存中获取就好了。







      
  • 大小: 37.1 KB
  • 大小: 11 KB
  • 大小: 28.6 KB
  • 大小: 44.9 KB
0
0
分享到:
评论

相关推荐

    官方原版源码spring-framework-5.0.13.RELEASE.zip

    学习Spring源码能够帮助开发者: - **理解设计模式**:Spring大量使用了工厂模式、单例模式、代理模式等,深入源码有助于提升设计能力。 - **优化性能**:了解内部工作原理后,能更好地调整配置,优化应用性能。 - ...

    官方原版源码 spring-framework-4.3.29.RELEASE.zip

    源码中,`org.springframework.context`包下的`ApplicationContext`接口及其实现类如`ClassPathXmlApplicationContext`和`FileSystemXmlApplicationContext`,是理解IoC容器的关键。 其次,AOP模块允许开发者定义横...

    spring-framework-4.2.5 所有jar包

    - `spring-core-4.2.5.RELEASE.jar`:包含了Spring的基础工具类和基本的IoC容器,如ClassPathXmlApplicationContext和BeanFactory。 - `spring-beans-4.2.5.RELEASE.jar`:处理bean的创建、配置和管理,支持XML和...

    spring源码(注释+测试版)

    这份"spring源码(注释+测试版)"提供了Spring框架的源代码,带有注释和测试用例,对于开发者深入理解Spring的工作原理非常有帮助。 1. **spring-core**:这是Spring框架的基础模块,包含了核心的工具类和资源处理...

    Spring源码总结.pdf

    在Spring源码中,容器的加载方式、XML属性配置的解析过程以及自定义标签的处理是核心知识点。 1. **Spring容器加载方式**: - **ClassPathXmlApplicationContext**: 通过类路径加载XML配置文件,适用于传统的Java...

    springAnalysis:spring源码阅读-spring源码阅读

    《深入剖析Spring源码》 在软件开发领域,Spring框架无疑是Java生态系统中的中流砥柱。作为一款开源的、全面的企业级应用框架,Spring以其强大的功能、易用性以及高度可扩展性赢得了广大开发者的心。本文将围绕...

    spring-framework-4.2.3.RELEASE 源码

    《Spring Framework 4.2.3.RELEASE 源码深度解析》 Spring Framework作为Java领域最广泛应用的轻量级框架之一,其4.2.3.RELEASE版本...通过源码学习,我们不仅能掌握Spring的使用,更能提升自己的编程思维和设计能力。

    模拟spring中的ClassPathXmlApplicationContext类的实现

    Spring框架是Java应用程序开发中的一个核心组件,它提供了一个依赖注入(DI)和面向切面编程(AOP)的解决方案。...通过阅读和分析Spring的源码,我们可以更好地掌握Spring如何管理和协调应用中的对象。

    Spring源码jar包下载

    源码对于任何开发者来说都是理解软件设计思想、学习新技能和解决问题的关键资源。`spring-2.5.6-sources.jar`文件包含了Spring框架2.5.6版本的源代码,这个版本虽然相对较为古老,但仍然是许多现有项目的基础,并且...

    spring源码

    Spring 源码的学习对于深入理解其工作原理、优化应用性能以及进行定制化开发具有重要意义。 首先,我们来看看 Spring 框架的核心概念: 1. **依赖注入(Dependency Injection, DI)**:Spring 的核心特性之一,...

    Spring源码学习七:web应用自动装配Spring配置文件1

    本文主要围绕"Spring源码学习七:web应用自动装配Spring配置文件1"这一主题,详细解析Web环境中Spring的初始化过程。 首先,我们注意到在传统的Java应用程序中,通常使用`ClassPathXmlApplicationContext`手动创建...

    Spring IoC源码深度剖析开源架构源码2021.pdf

    5. **搭建Spring源码阅读环境** - 从GitHub下载Spring框架的源码。 - 安装和配置 `gradle`、Idea等开发工具。 - 根据Spring的模块结构编译源码,通常需要按照 `core-oxm-context-beans-aspects-aop` 的顺序进行。...

    Spring源码学习四:BeanDefinition装载前奏曲1

    在深入Spring源码的学习过程中,我们主要关注BeanDefinition的装载过程。BeanDefinition是Spring框架的核心概念,它包含了关于Bean的所有元数据,如类名、属性、依赖关系等。在Spring初始化时,会读取XML配置文件,...

    spring的jar包源码

    Spring框架是Java开发中不可或缺的一部分,它以其模块化、...通过深入学习这些源码,开发者可以更好地理解Spring框架的工作原理,优化代码,以及自定义扩展。对于想成为Spring专家的开发者来说,这是一份宝贵的资源。

    spring及springmvc源码

    在源码学习过程中,你可能会遇到以下关键类和接口:`RequestMappingHandlerMapping`, `RequestMappingHandlerAdapter`, `SimpleControllerHandlerAdapter`, `ModelAndView`, `DefaultListableBeanFactory`, `Bean...

    spring1.2.8-src

    总的来说,通过研究 Spring 1.2.8 的源代码,我们可以深入了解这个框架的工作原理,学习如何利用 DI、AOP、数据库操作、消息传递和Web开发等核心概念,这对于任何希望成为熟练的 Java 开发者来说都是宝贵的资源。...

    spring-framework5.1.7:spring-framework5.1.7源码解析

    学习Spring源码建议构建Spring-framemwork源码环境(这是一个比较麻烦的过程,可能遇到各种问题,需要有耐心..),新建一个模块打断点一步步调试。 举个例子,这是Spring的.class反编译的结果,不但没有注释,暗示性...

    spring-4.2.1所有jar包的源代码

    在源代码中,可以研究`org.springframework.beans`和`org.springframework.context`包,这两个包提供了Bean工厂和ApplicationContext接口,以及相关的实现类,如ClassPathXmlApplicationContext和...

    Spring IOC源码解读

    Spring IOC,即Inversion of Control(控制反转),是Spring框架的核心特性之一,它负责管理和装配应用程序中的对象。...理解并掌握Spring的IOC源码,对于深入学习Spring框架以及提升系统设计能力具有重要意义。

Global site tag (gtag.js) - Google Analytics