- 浏览: 1230818 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
lankk:
lankk 写道事实上,在运行String s1=new St ...
理解String 及 String.intern() 在实际中的应用 -
lankk:
事实上,在运行String s1=new String(&qu ...
理解String 及 String.intern() 在实际中的应用 -
lankk:
同意1楼的说法http://docs.oracle.com/j ...
理解String 及 String.intern() 在实际中的应用 -
raoyutao:
...
jdk 线程池 ThreadPoolExecutor -
hongdanning:
理解了。之前困惑的一些明白了。谢谢分享。
理解String 及 String.intern() 在实际中的应用
web.xml
<listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
public class ContextLoaderListener extends ContextLoader
private ContextLoader contextLoader; public void contextInitialized(ServletContextEvent event) { this.contextLoader = createContextLoader(); if (this.contextLoader == null) { this.contextLoader = this; } this.contextLoader.initWebApplicationContext(event.getServletContext()); } @Deprecated protected ContextLoader createContextLoader() { return null; }
public class ContextLoader
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!"); } long startTime = System.currentTimeMillis(); try { // Determine parent for root web application context, if any. ApplicationContext parent = loadParentContext(servletContext);// 这个地方一般会为null // 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); currentContextPerThread.put(Thread.currentThread().getContextClassLoader(), 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; } catch (RuntimeException ex) { logger.error("Context initialization failed", ex); servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, ex); throw ex; } catch (Error err) { logger.error("Context initialization failed", err); servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, err); throw err; } } protected ApplicationContext loadParentContext(ServletContext servletContext) { ApplicationContext parentContext = null; String locatorFactorySelector = servletContext.getInitParameter(LOCATOR_FACTORY_SELECTOR_PARAM); String parentContextKey = servletContext.getInitParameter(LOCATOR_FACTORY_KEY_PARAM); // public static final String LOCATOR_FACTORY_KEY_PARAM = "parentContextKey"; // 一般都没在web.xml设这个参数 所以最后会返回null if (parentContextKey != null) { // locatorFactorySelector may be null, indicating the default "classpath*:beanRefContext.xml" BeanFactoryLocator locator = ContextSingletonBeanFactoryLocator.getInstance(locatorFactorySelector); Log logger = LogFactory.getLog(ContextLoader.class); if (logger.isDebugEnabled()) { logger.debug("Getting parent context definition: using parent context key of '" + parentContextKey + "' with BeanFactoryLocator"); } this.parentContextRef = locator.useBeanFactory(parentContextKey); parentContext = (ApplicationContext) this.parentContextRef.getFactory(); } return parentContext; } protected WebApplicationContext createWebApplicationContext(ServletContext sc, ApplicationContext parent) { Class<?> contextClass = determineContextClass(sc);// 这里要好好看下 if (!ConfigurableWebApplicationContext.class.isAssignableFrom(contextClass)) { throw new ApplicationContextException("Custom context class [" + contextClass.getName() + "] is not of type [" + ConfigurableWebApplicationContext.class.getName() + "]"); }// 看下contextClass 是不是 ConfigurableWebApplicationContext的子类 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(); if (servletContextName != null) { wac.setId(ConfigurableWebApplicationContext.APPLICATION_CONTEXT_ID_PREFIX + servletContextName); } else { wac.setId(ConfigurableWebApplicationContext.APPLICATION_CONTEXT_ID_PREFIX); } } else { // Servlet 2.5's getContextPath available! wac.setId(ConfigurableWebApplicationContext.APPLICATION_CONTEXT_ID_PREFIX + sc.getContextPath()); } wac.setParent(parent); wac.setServletContext(sc); wac.setConfigLocation(sc.getInitParameter(CONFIG_LOCATION_PARAM)); customizeContext(sc, wac); wac.refresh(); return wac; } protected Class<?> determineContextClass(ServletContext servletContext) { String contextClassName = servletContext.getInitParameter(CONTEXT_CLASS_PARAM); // public static final String CONTEXT_CLASS_PARAM = "contextClass"; //你想要加载自己的扩张applicationContext类的话可以把类名写在这个参数里 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); } } } 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); // private static final String DEFAULT_STRATEGIES_PATH = "ContextLoader.properties"; //我们没有在类路径放这个文件啊 哦 原来他在spring-web.jar 的 org/springframework/web/context/ContextLoader.properties defaultStrategies = PropertiesLoaderUtils.loadProperties(resource); } catch (IOException ex) { throw new IllegalStateException("Could not load 'ContextLoader.properties': " + ex.getMessage()); } }
ContextLoader.properties
# Default WebApplicationContext implementation class for ContextLoader. # Used as fallback when no explicit context implementation has been specified as context-param. # Not meant to be customized by application developers. org.springframework.web.context.WebApplicationContext=org.springframework.web.context.support.XmlWebApplicationContext
所以最后加载出来的beanFactory 是XmlWebApplicationContext
发表评论
-
ServiceLocatorFactoryBean 学习
2016-01-27 14:36 3386今天看一个新项目 ... -
连接池exception GetConnectionTimeoutException get/close not same thread
2015-09-24 14:44 7120环境 hibernate 4.2.0.Final sp ... -
jboss Closing a connection for you
2011-05-10 19:06 2059jboss 报了如下的错 [CachedConnect ... -
jersey spring tomcat 集成
2011-05-04 15:39 3621首先把jersey的相关jar放到WEB-INF/lib目录下 ... -
spring security debug 小结
2010-05-21 16:06 2916有时需要在默认的filter之前定义自己的filter来改 ... -
spring security 修改 RememberMeServices的key
2010-05-21 12:11 2130用RememberMe的时候想改一些RememberMeSer ... -
spring security ajax
2010-05-20 16:39 2761转自 http://loianegroner.com/2010 ... -
spring security 自定义过滤器
2010-05-20 13:45 4111Filters 'com.lich0079.services. ... -
web 代码中 如何获得 applicationcontext 及与 beanfactory 区别
2010-05-19 17:18 1965WebApplicationContextUtils.getW ... -
spring aop
2009-12-11 18:35 1450spring对AOP的支持(采用Annotation的方式)1 ... -
spring 初步
2009-12-11 18:34 11151、spring普通属性注入 参见spring文档3.3. ... -
spring servlet jdbc
2009-12-05 18:14 2351这个文章的关注点是如何在只准使用servlet jsp jdb ... -
Spring+Ibatis构建多库业务系统(一)
2009-06-17 18:33 1469http://244369.blog.chinajavawor ... -
使用spring发送邮件例
2009-03-04 11:50 2485使用javamail來發送信件的主要流程是由 web serv ...
相关推荐
Spring源码学习九:DispatcherServlet初始化源码分析1 DispatcherServlet是SpringMVC的核心分发器,它实现了请求分发,是处理请求的入口,本篇将深入源码分析它的初始化过程。 首先,从DispatcherServlet的名称上...
在Spring MVC框架中,应用程序启动时会执行一系列初始化操作,这些操作对于理解Spring...在实际开发中,我们可以通过阅读源码、调试或日志跟踪,更深入地了解这些初始化操作的细节,从而提升我们的Spring MVC编程技能。
从加载过程我们可以看到,首先从Servlet事件中得到ServletContext,然后可以读到配置好的在web.xml的中的各个属性值,然后ContextLoder实例化WebApplicationContext并完成其载入和初始化作为根上下文。当这个根上...
在Spring源代码解析的第四部分中,我们将重点关注DispatcherServlet的初始化过程,它是Spring MVC的核心组件。 DispatcherServlet是一个特殊的Servlet,它负责接收HTTP请求,并根据请求映射到相应的处理器...
DispatcherServlet 首先是一个 Servlet,Servlet 有自己的生命周期的方法(init、destory 等),那么我们在看 DispatcherServlet 初始化时首先需要看源码中 DispatcherServlet 的类结构设计。 DispatcherServlet 的...
总之,`Spring-5.1.5源码`的分析涵盖了Spring框架在Web应用中的核心功能,包括初始化、配置加载、依赖注入、AOP、异常处理以及现代化Web技术的支持。深入理解这些知识点,对于提升Spring框架的使用技巧和开发效率...
本文主要围绕"Spring源码学习七:web应用自动装配Spring配置文件1"这一主题,详细解析Web环境中Spring的初始化过程。 首先,我们注意到在传统的Java应用程序中,通常使用`ClassPathXmlApplicationContext`手动创建...
这个过程涉及到一系列的初始化步骤,确保Spring能够正确地与Web容器集成。 首先,`WebApplicationContext`是`ApplicationContext`的一个扩展,专门针对Web应用设计。它增加了对`ServletContext`的访问和管理,使得...
Spring的IOC容器在初始化时会读取配置文件,解析Bean的定义,然后根据这些定义创建Bean实例。在Bean实例化的过程中,可以通过依赖注入(Dependency Injection,DI)来解决对象间的依赖关系。DI有两种主要形式:...
- **`initMessageSource()`**:初始化消息源,支持国际化。 - **`initApplicationEventMulticaster()`**:初始化事件的多播器。 - **`onRefresh()`**:一个空的方法实现,留给子类重写。 - **`registerListeners()`*...
Struts的ActionServlet可以配置为Spring的WebApplicationContext的初始化参数,以便于Spring管理Action。 3. **整合Hibernate与Spring**:Spring的Hibernate支持允许在不直接编写SessionFactory和Session的情况下...
WebApplicationContext通常在Web应用启动时初始化,并在Web应用运行期间一直存在,这样可以保证Bean的实例是单例的。 在Spring MVC中,通常会配置两个层面的WebApplicationContext,即父上下文和子上下文。父上下文...
### 深入剖析Spring Web源码 #### 一、Spring Web MVC介绍 **1.1 MVC体系结构** MVC(Model-View-Controller)是一种软件架构设计模式,被广泛应用于构建用户界面丰富的应用程序中。它将应用程序逻辑分为三个核心...
总结,Spring MVC的执行流程包括初始化阶段(创建`WebApplicationContext`,配置`ServletConfig`和`ServletContext`)和请求处理阶段(通过`DispatcherServlet`接收请求,分发到相应的Controller处理,然后返回响应...
根据提供的文件信息:“看透springMvc源代码分析与实践”,我们可以深入探讨Spring MVC框架的核心概念、设计模式以及其实现机制。下面将详细分析Spring MVC的关键组成部分,并通过源代码层面进行解读,帮助读者更好...
5. **ApplicationContext的创建**:包括AnnotationConfigApplicationContext或WebApplicationContext的选择,以及其初始化过程。 6. **Bean的初始化**:讲解SpringBoot如何通过@ComponentScan、@...
- Spring管理的Bean有创建、初始化、配置、销毁等生命周期阶段,开发者可以通过实现接口或使用注解自定义生命周期行为。 - 2.5版本对生命周期回调方法进行了优化,增加了更多的回调接口和注解。 8. **国际化与...
本篇我们将聚焦于"Spring学习笔记系列之三"中的关键知识点——SpringMVC的源码分析,特别是父子容器的启动原理。这个主题是理解Spring MVC工作流程、定制化配置以及优化应用程序性能的关键。 首先,我们要明白...
Spring MVC 的初始化流程是其工作原理的核心部分之一。通过深入理解 `DispatcherServlet` 的初始化逻辑以及相关的方法实现细节,我们可以更好地掌握 Spring MVC 的架构设计思想和开发技巧。这不仅有助于提高我们的...
7. **Spring Boot**:虽然不是 2.5.6 版本的一部分,但值得一提的是,Spring Boot 是后来推出的一个项目,它简化了基于 Spring 的应用的初始化和配置过程,是现代 Spring 应用的首选启动方式。 8. **Spring ...