`

Spring3.0源码学习---IOC(一)

阅读更多

        最近在SVN上下载了Spring3.0的源码学习. 先介绍个人到现在对于Spring中IOC的认识吧.欢迎大家一起讨论,呵呵,别拍砖.

 

     Spring的IOC的实现分为 1. 资源(Resource)定位 2.资源(Resource)载入 3.资源的解析 4.Bean的注册  5.getBean时对象依赖关系的注入.以最通常用的web项目开始

 

      Spring通过web容器启动是通过org.springframework.web.context.ContextLoaderListener来实现的,其代码如下:

其对ContextLoader的继承及对ServletContextListener的实现使用了适配器模式.

现在看看contextLoader中的initWebApplicationContext方法.

//监听器的初始化方法.对web应用的上下文进行初始化
public void contextInitialized(ServletContextEvent event) {
	this.contextLoader = createContextLoader();
	if (this.contextLoader == null) {
		this.contextLoader = this;
	}
	this.contextLoader.initWebApplicationContext (event.getServletContext());
}
 
 
public WebApplicationContext initWebApplicationContext(ServletContext servletContext) {
	if (servletContext.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE) != null) {
		throw new IllegalStateException(
				"Cannot initialize context because there is already a root application context present - " +
				"check whether you have multiple ContextLoader* definitions in your web.xml!");
	}

	Log logger = LogFactory.getLog(ContextLoader.class);
	servletContext.log("Initializing Spring root WebApplicationContext");
	if (logger.isInfoEnabled()) {
		logger.info("Root WebApplicationContext: initialization started");
	}
	long startTime = System.currentTimeMillis();

	try {
		// Determine parent for root web application context, if any.
		ApplicationContext parent = loadParentContext(servletContext);

		// Store context in local instance variable, to guarantee that
		// it is available on ServletContext shutdown.
		this.context = createWebApplicationContext(servletContext, parent);
		servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, this.context);

		ClassLoader ccl = Thread.currentThread().getContextClassLoader();
		if (ccl == ContextLoader.class.getClassLoader()) {
			currentContext = this.context;
		}
		else if (ccl != null) {
			currentContextPerThread.put(ccl, this.context);
		}

		if (logger.isDebugEnabled()) {
			logger.debug("Published root WebApplicationContext as ServletContext attribute with name [" +
					WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE + "]");
		}
		if (logger.isInfoEnabled()) {
			long elapsedTime = System.currentTimeMillis() - startTime;
			logger.info("Root WebApplicationContext: initialization completed in " + elapsedTime + " ms");
		}

		return this.context;
		}//异常略...
}

 

   对容器的初始化的过程主要是通过  this.context = createWebApplicationContext(servletContext, parent);
  这句完成的..进入createWebApplicationContext方法

 

	protected WebApplicationContext createWebApplicationContext(ServletContext sc, ApplicationContext parent) {
		//得到确定的class对象.determineContextClass中首先在web.xml中查询是否有配置contextclass的上下文.
		//如果有配置,则根据所配置的对象得到其class对象.否则通过在ContextLoader.properties的
		//org.springframework.web.context.WebApplicationContext=org.springframework.web.context.support.XmlWebApplicationContext
		//得到XmlWebApplicationContext的class对象
		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为接口.
		//通过反射将对象实例化.如果web.xml中未配置contextclass的话,实际上是XmlWebApplicationContext对象
		ConfigurableWebApplicationContext wac =
				(ConfigurableWebApplicationContext) BeanUtils.instantiateClass(contextClass);

		// Assign the best possible id value.
		if (sc.getMajorVersion() == 2 && sc.getMinorVersion() < 5) {
			// Servlet <= 2.4: resort to name specified in web.xml, if any.
			String servletContextName = sc.getServletContextName();
			wac.setId(ConfigurableWebApplicationContext.APPLICATION_CONTEXT_ID_PREFIX +
					ObjectUtils.getDisplayString(servletContextName));
		}
		else {
			// Servlet 2.5's getContextPath available!
			try {
				String contextPath = (String) ServletContext.class.getMethod("getContextPath").invoke(sc);
				wac.setId(ConfigurableWebApplicationContext.APPLICATION_CONTEXT_ID_PREFIX +
						ObjectUtils.getDisplayString(contextPath));
			}
			catch (Exception ex) {
				throw new IllegalStateException("Failed to invoke Servlet 2.5 getContextPath method", ex);
			}
		}

		wac.setParent(parent);
		wac.setServletContext(sc);
		wac.setConfigLocation(sc.getInitParameter(CONFIG_LOCATION_PARAM));
		customizeContext(sc, wac);
		//容器初始化的入口
		wac.refresh();
		return wac;
	}

  

 

分享到:
评论

相关推荐

    Spring3.0 chmAPI 和 Spring3.0所有jar 和 Spring3.0源码

    **Spring3.0源码** 源码可以帮助开发者深入理解Spring的工作原理,学习最佳实践,并根据需要进行定制。源码包含了Spring框架的所有模块,包括IoC(控制反转)容器、AOP代理、事件处理、MVC框架等。通过阅读源码,...

    spring3.0 源码

    本文将深入探讨Spring 3.0源码,揭示其核心设计理念和实现机制,帮助开发者更好地理解和应用这个强大的框架。 一、IoC(Inversion of Control)容器 Spring的核心是IoC容器,它负责管理对象的生命周期和依赖关系。...

    Spring 3.0就这么简单源码Maven的jar包001

    Spring 3.0是Spring框架的一个...结合Maven的使用,开发者不仅可以快速构建项目,还能通过源码学习到框架的精髓,提升自己的技能水平。对于想要深入理解Spring框架的人来说,阅读和研究这些源码无疑是一条有效的途径。

    spring 3.0 src

    通过对Spring 3.0源码的深入学习,开发者可以更好地理解其内部工作原理,优化自己的代码,解决实际问题,并为升级到更高版本或理解Spring框架后续发展打下坚实基础。通过分析源码,我们可以了解到设计模式的应用,如...

    Spring3.0就这么简单源码

    《Spring3.0就这么简单》是一本专注于Spring框架3.0版本的图书,其源代码提供了深入理解Spring工作原理的机会。这本书旨在简化Spring框架的学习过程,通过实例和源码解析,帮助读者快速掌握Spring的核心概念和技术。...

    spring-frameword3.0源码

    总的来说,Spring框架3.0源码是一个宝贵的教育资源,涵盖了从基础的JDBC操作到复杂的MVC设计模式的实现。通过细致研究,开发者可以深化对Spring的理解,提高编程技能,并能更有效地解决实际问题。

    spring3.0jar包及源码

    在学习Spring 3.0源码时,可以重点关注以下几个方面: - BeanFactory和ApplicationContext接口的实现,了解bean的创建、初始化和依赖注入过程。 - AOP的实现,如Pointcut、Advisor、Proxy等类的交互。 - MVC的...

    spring3.0学习

    此外,Spring的事件驱动模型和资源管理也是源码学习的重点。 至于工具应用,Spring 3.0与各种工具的整合是提升开发效率的关键。例如,与Maven或Gradle的集成,简化了项目的构建过程;Eclipse和IntelliJ IDEA的...

    spring3.0就是这么简单代码

    《Spring 3.0 就是这么简单》是一本针对初学者和中级开发者的书籍,由陈雄华和林开雄合著。...书中涵盖的内容全面,从基本概念到实战技巧,为读者提供了一个扎实的学习平台,使Spring 3.0变得“就这么简单”。

    javascript and Spring3.0下载地址

    JavaScript 和 Spring 3.0 是两个在IT领域中至关重要的技术。JavaScript,作为前端...阅读博客文章,如给出的链接,也是一个很好的学习途径,它可能包含了作者在使用JavaScript和Spring 3.0时的经验分享和技巧总结。

    spring-framework-3.2.x源码

    Spring Framework 3.2.x是Java开发中广泛使用的开源应用程序框架,由Pivotal Software公司维护。...同时,这也是一个不断学习和探索的过程,因为Spring框架持续演进,新的版本引入了更多先进的特性和最佳实践。

    Spring3.0.2-Source源码

    总的来说,Spring 3.0.2源码的学习是一次宝贵的编程之旅,它揭示了这个强大框架背后的设计思想和实现细节,对于提升Java企业级开发能力具有重要意义。通过阅读和理解源码,开发者能够更好地利用Spring解决实际问题,...

    spring 源码

    通过分析Spring 3.0源码,我们可以深入了解IoC容器的工作流程、AOP的实现机制以及如何与各种数据访问技术集成。理解这些关键点将有助于你更好地利用Spring框架,编写出更加高效、可维护的代码。在学习源码的过程中,...

    《Spring IOC核心技术》- 冰河原创电子书

    《Spring IOC核心技术》是冰河原创的一本专注于Spring IOC核心概念和技术的电子书。Spring作为Java开发领域的重要框架,它的依赖注入(IOC)机制是其核心功能之一,它极大地简化了对象之间的耦合,提高了代码的灵活...

    springboot 3.0.2 自动配置(auto-configuration) 启动器(starter)保姆级教程带源码

    Spring Boot 3.0.2 自动配置(auto-configuration)和启动器(starter)是其核心特性,旨在简化Spring应用程序的开发过程。本篇保姆级教程将带你深入...本教程提供的源码分析和示例将帮助你深入学习并实践这些知识。

Global site tag (gtag.js) - Google Analytics