`
j小虫
  • 浏览: 19008 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

spring源码学习(二)

    博客分类:
  • java
 
阅读更多

这一段我主要去看看spring容器的创建,继续(一)的代码,我们看

 

if (this.context == null) {
				this.context = createWebApplicationContext(servletContext);
			}

 

 

创建容器

 

protected WebApplicationContext createWebApplicationContext(ServletContext sc) {
		Class<?> contextClass = determineContextClass(sc);
		if (!ConfigurableWebApplicationContext.class.isAssignableFrom(contextClass)) {
			throw new ApplicationContextException("Custom context class [" + contextClass.getName() +
					"] is not of type [" + ConfigurableWebApplicationContext.class.getName() + "]");
		}
		ConfigurableWebApplicationContext wac =
				(ConfigurableWebApplicationContext) BeanUtils.instantiateClass(contextClass);
		return wac;
	}

 

 

Class<?> contextClass = determineContextClass(sc);

既然要创建一个context,首先需要确定context是由什么类定义, 这一行就是获取context的类,我们点进去看

 

 

 

 

protected Class<?> determineContextClass(ServletContext servletContext) {
		String contextClassName = servletContext.getInitParameter(CONTEXT_CLASS_PARAM);
		if (contextClassName != null) {
			try {
				return ClassUtils.forName(contextClassName, ClassUtils.getDefaultClassLoader());
			}
			catch (ClassNotFoundException ex) {
				throw new ApplicationContextException(
						"Failed to load custom context class [" + contextClassName + "]", ex);
			}
		}
		else {
			contextClassName = defaultStrategies.getProperty(WebApplicationContext.class.getName());
			try {
				return ClassUtils.forName(contextClassName, ContextLoader.class.getClassLoader());
			}
			catch (ClassNotFoundException ex) {
				throw new ApplicationContextException(
						"Failed to load default context class [" + contextClassName + "]", ex);
			}
		}
	}

 

 

servletContext.getInitParameter

 是取web.xml里的配置参数,意思就是先看看我们有没有自己定义context的类

 

 

return ClassUtils.forName(contextClassName, ClassUtils.getDefaultClassLoader());

 如果我们定义了,直接返回这个class.

 

 

 

contextClassName = defaultStrategies.getProperty(WebApplicationContext.class.getName());

 

 

如果没有定义的话,去defaultStrategies里去取,WebApplicationContext的类名作为key

 

 

那么defaultStrategies里的值哪来的呢,我们ctrl+o,然后搜索defaultStrategies,会看到

private static final String DEFAULT_STRATEGIES_PATH = "ContextLoader.properties";
private static final Properties defaultStrategies;

	static {
		// Load default strategy implementations from properties file.
		// This is currently strictly internal and not meant to be customized
		// by application developers.
		try {
			ClassPathResource resource = new ClassPathResource(DEFAULT_STRATEGIES_PATH, ContextLoader.class);
			defaultStrategies = PropertiesLoaderUtils.loadProperties(resource);
		}
		catch (IOException ex) {
			throw new IllegalStateException("Could not load 'ContextLoader.properties': " + ex.getMessage());
		}
	}

 在类加载的时候,会去当前目录取这个属性文件

ContextLoader.properties

 

 

我们看看spring的jar包中,当前这个类是org.springframework.web.context.ContextLoader,那么我们就去web包的context路径下看



 

可以看到contextLoader.properties文件在这里,打开查看里面的配置,我们会发现spring在web工程中,默认使用的context,默认是xmlWebApplicationContext


 

看到这里我会建议最好先去看看xmlWebApplicationContext的上下继承关系,至少需要知道它具备哪些特性

有了大致的了解后再接着往下读

 

 

接着回到创建容器的代码里来

protected WebApplicationContext createWebApplicationContext(ServletContext sc) {
		Class<?> contextClass = determineContextClass(sc);
		if (!ConfigurableWebApplicationContext.class.isAssignableFrom(contextClass)) {
			throw new ApplicationContextException("Custom context class [" + contextClass.getName() +
					"] is not of type [" + ConfigurableWebApplicationContext.class.getName() + "]");
		}
		ConfigurableWebApplicationContext wac =
				(ConfigurableWebApplicationContext) BeanUtils.instantiateClass(contextClass);
		return wac;
	}

 

第一行我们知道了spring的web工程会首先取用户在web.xml里配置的context的类,如果用户配置了,就采用配置的,如果用户没有配置,就采用默认的xmlWebApplicationContext

 

接着进入第2行,不管采用配置的还是默认的,spring要求,必须是可配置的,也就是configurable.

只有是Configurable,才能进行后续的配置操作,至于Configurable的具体含义,我们后面会了解到。

 

 

现在紧接着

ConfigurableWebApplicationContext wac =
				(ConfigurableWebApplicationContext) BeanUtils.instantiateClass(contextClass);

 

这个方法是用xmlWebApplicationContext的类作为参数,调用它的无参构造,实例一个对象,也就是我们期待已久的spring容器对象,至此,spring容器创建了

 

接下来在(三)里,我们去学习填充容器的过程,包括它是怎么配置的,还有最重要的,它是怎么刷新的,“刷新”这个动作就是将spring的xml配置变成bean,这个是ioc的核心,会涉及到一系列  beans包和core包,还有io包下的东西,所以建议一起学习的朋友在看下去之前,先随便了解一些bean包的相关结构和知识。
 

  • 大小: 17.6 KB
  • 大小: 11.3 KB
分享到:
评论

相关推荐

    Spring学习笔记&源码

    本资料“Spring学习笔记&源码”是基于网易云课堂黑马程序员的Spring四天精通课程,旨在帮助学习者深入理解和实践Spring框架。 笔记部分可能会涵盖以下内容: 1. **Spring概述**:介绍Spring框架的历史、特点和主要...

    Spring源码学习加注释,方便学习.zip

    spring源码中文注释方便学习,spring源码学习加注释。 spring源码中文注释方便学习,spring源码学习加注释。 spring源码中文注释方便学习,spring源码学习加注释。 spring源码中文...

    Spring高级源码学习笔记.zip

    总之,Spring源码学习是一个深化编程技能,理解设计模式,以及提高问题解决能力的过程。通过深入研究,程序员不仅可以优化自己的代码,还能更高效地利用Spring框架提供的功能,提升项目的可维护性和扩展性。

    spring源码学习之思维导图

    1、spring 的整体架构 2、spring的基本实现(xml的加载原理、标签解析、bean加载) 3、容器扩展 4、ioc和aop 5、事务 6、springmvc 7、dispatcherServlet

    spring源码,配套完善的注释

    本压缩包包含了Spring的源码,对于理解Spring的工作原理、深入学习和优化自己的项目具有极大的帮助。 源码分析: 1. **IoC容器**:Spring的核心是IoC容器,它负责管理对象的生命周期和依赖关系。通过XML配置文件或...

    spring 源码环境搭建

    "spring源码" 是指 Spring 框架的源代码。 部分内容解释 1. 下载 GitHub 客户端安装 下载 GitHub 客户端是因为 Spring 源码托管在 GitHub 上,所以我们需要下载 GitHub 客户端来 clone Spring 源码。安装成功后,...

    spring 源码中文注释

    Spring框架是Java开发中最广泛应用的轻量级框架之一,它以IoC(Inversion of Control,控制反转)和AOP...通过学习源码,我们可以更全面地掌握Spring框架,提升自己的技术水平,更好地应对各种复杂的软件开发挑战。

    深入剖析Spring Web源码 pdf高清版(第二版)

    3. 设计模式学习:Spring源码中包含了许多经典的设计模式,如工厂模式、代理模式、装饰者模式等,学习源码有助于提升设计能力。 综上所述,《深入剖析Spring Web源码》(第二版) 对于想要深入理解和优化Spring Web...

    spring源码注释中文

    Spring 源码注释中文版的提供,使得开发者能够更加深入地理解 Spring 的工作原理,无需经过复杂的编译过程,可以直接阅读源码注释来学习。 Spring 框架主要由以下几个关键模块组成: 1. **Core Container(核心...

    构建为eclipse项目的spring源码

    在Eclipse中构建Spring源码项目,可以帮助我们深入理解Spring的工作原理,从而更好地利用它来构建高效、可维护的Java应用。以下将详细阐述如何构建和探索Spring源码。 1. **获取源码** Spring源码可以从官方GitHub...

    spring源码

    学习Spring源码有助于深入理解其内部工作原理,例如bean的生命周期管理、AOP的实现、以及MVC的请求处理流程。这将有助于开发者更高效地利用Spring框架,编写出高质量、高性能的Java应用。通过分析源码,开发者还可以...

    Spring攻略(第二版)书籍源码

    《Spring攻略(第二版)书籍源码》是一个深入学习Spring框架的重要资源,它包含了作者在编写书籍过程中所使用的完整代码示例。这份源码旨在帮助读者更好地理解和实践Spring框架的各种功能和最佳实践。 Spring框架是...

    Spring源码学习一:源码分析概述1

    Spring源码学习概述 Spring是Java生态系统中的一种流行的开源框架,由Rod Johnson创立于2003年。Spring框架的主要目标是使Java应用程序的开发变得更加简洁、灵活和可维护。Spring框架的核心思想是基于依赖注入...

    spring源码(注释+测试版)

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

    spring源码分析专题学习资源

    spring源码分析专题,源码分析视频,对spring的源码进行分析

    Tom_深入分析Spring源码

    《Spring源码分析》这份资料深入探讨了Spring框架的核心机制,尤其聚焦于Spring5版本。Spring作为Java领域中最重要的轻量级应用框架之一,它的设计理念、实现方式以及工作原理对于任何想成为优秀Java开发者的人都至...

    idea+gradle构建spring源码环境.docx

    在本文中,我们将详细介绍如何使用 IDEA 和 Gradle 构建 Spring 源码环境,以便深入学习 Spring 源码。下面是具体的步骤和知识点总结。 一、下载 Spring 源码 下载 Spring 源码有两种方式:一种是直接下载 zip ...

    spring框架学习源码

    在这个"Spring框架学习源码"中,我们将会探讨以下几个关键知识点: 1. **SpringBoot**:SpringBoot简化了Spring应用程序的初始搭建以及开发过程。它内置了Tomcat服务器,提供了一种默认的配置,使得开发者可以快速...

    spring源码可导入eclipse版本 第二部分

    本资源包含的是可以直接导入Eclipse IDE的Spring源码,使得开发者能够更方便地学习、理解和调试Spring的内部工作原理。 首先,让我们了解一下Spring框架的核心组件和概念: 1. **IoC(Inversion of Control)容器*...

    马士兵老师spring框架学习笔记

    马士兵老师是知名的Java教育专家,他的Spring框架学习笔记深入浅出,对于初学者和进阶者来说都是一份宝贵的资源。这份笔记涵盖了Spring的核心概念、配置、AOP(面向切面编程)、DI(依赖注入)等关键知识点。 1. **...

Global site tag (gtag.js) - Google Analytics