最近在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源码** 源码可以帮助开发者深入理解Spring的工作原理,学习最佳实践,并根据需要进行定制。源码包含了Spring框架的所有模块,包括IoC(控制反转)容器、AOP代理、事件处理、MVC框架等。通过阅读源码,...
本文将深入探讨Spring 3.0源码,揭示其核心设计理念和实现机制,帮助开发者更好地理解和应用这个强大的框架。 一、IoC(Inversion of Control)容器 Spring的核心是IoC容器,它负责管理对象的生命周期和依赖关系。...
Spring 3.0是Spring框架的一个...结合Maven的使用,开发者不仅可以快速构建项目,还能通过源码学习到框架的精髓,提升自己的技能水平。对于想要深入理解Spring框架的人来说,阅读和研究这些源码无疑是一条有效的途径。
通过对Spring 3.0源码的深入学习,开发者可以更好地理解其内部工作原理,优化自己的代码,解决实际问题,并为升级到更高版本或理解Spring框架后续发展打下坚实基础。通过分析源码,我们可以了解到设计模式的应用,如...
《Spring3.0就这么简单》是一本专注于Spring框架3.0版本的图书,其源代码提供了深入理解Spring工作原理的机会。这本书旨在简化Spring框架的学习过程,通过实例和源码解析,帮助读者快速掌握Spring的核心概念和技术。...
总的来说,Spring框架3.0源码是一个宝贵的教育资源,涵盖了从基础的JDBC操作到复杂的MVC设计模式的实现。通过细致研究,开发者可以深化对Spring的理解,提高编程技能,并能更有效地解决实际问题。
在学习Spring 3.0源码时,可以重点关注以下几个方面: - BeanFactory和ApplicationContext接口的实现,了解bean的创建、初始化和依赖注入过程。 - AOP的实现,如Pointcut、Advisor、Proxy等类的交互。 - MVC的...
此外,Spring的事件驱动模型和资源管理也是源码学习的重点。 至于工具应用,Spring 3.0与各种工具的整合是提升开发效率的关键。例如,与Maven或Gradle的集成,简化了项目的构建过程;Eclipse和IntelliJ IDEA的...
《Spring 3.0 就是这么简单》是一本针对初学者和中级开发者的书籍,由陈雄华和林开雄合著。...书中涵盖的内容全面,从基本概念到实战技巧,为读者提供了一个扎实的学习平台,使Spring 3.0变得“就这么简单”。
JavaScript 和 Spring 3.0 是两个在IT领域中至关重要的技术。JavaScript,作为前端...阅读博客文章,如给出的链接,也是一个很好的学习途径,它可能包含了作者在使用JavaScript和Spring 3.0时的经验分享和技巧总结。
Spring Framework 3.2.x是Java开发中广泛使用的开源应用程序框架,由Pivotal Software公司维护。...同时,这也是一个不断学习和探索的过程,因为Spring框架持续演进,新的版本引入了更多先进的特性和最佳实践。
总的来说,Spring 3.0.2源码的学习是一次宝贵的编程之旅,它揭示了这个强大框架背后的设计思想和实现细节,对于提升Java企业级开发能力具有重要意义。通过阅读和理解源码,开发者能够更好地利用Spring解决实际问题,...
通过分析Spring 3.0源码,我们可以深入了解IoC容器的工作流程、AOP的实现机制以及如何与各种数据访问技术集成。理解这些关键点将有助于你更好地利用Spring框架,编写出更加高效、可维护的代码。在学习源码的过程中,...
《Spring IOC核心技术》是冰河原创的一本专注于Spring IOC核心概念和技术的电子书。Spring作为Java开发领域的重要框架,它的依赖注入(IOC)机制是其核心功能之一,它极大地简化了对象之间的耦合,提高了代码的灵活...
Spring Boot 3.0.2 自动配置(auto-configuration)和启动器(starter)是其核心特性,旨在简化Spring应用程序的开发过程。本篇保姆级教程将带你深入...本教程提供的源码分析和示例将帮助你深入学习并实践这些知识。