ApplicationContext 是Spring的核心,Context我们通常解释为上下文环境,我想用“容器”来表述它更容易理解一些,ApplicationContext则是“应 用的容器”了:P,Spring把Bean放在这个容器中,在需要的时候,用getBean方法取出,虽然我没有看过这一部分的源代码,但我想它应该是一 个类似Map的结构。
在Web应用中,我们会用到WebApplicationContext,WebApplicationContext继 承自ApplicationContext,先让我们看看在Web应用中,怎么初始化WebApplicationContext,在web.xml中定 义:
xml 代码
- <context-param>
- <param-name>contextConfigLocation</param-name>
- <param-value>/WEB-INF/applicationContext.xml</param-value>
- </context-param>
-
- <listener>
- <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
- </listener>
xml 代码
- <servlet>
- <servlet-name>context</servlet-name>
- <servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>
- <load-on-startup>1</load-on-startup>
- </servlet>
可 以看出,有两种方法,一个是用ContextLoaderListener这个Listerner,另一个是ContextLoaderServlet这 个Servlet,这两个方法都是在web应用启动的时候来初始化WebApplicationContext,我个人认为Listerner要比 Servlet更好一些,因为Listerner监听应用的启动和结束,而Servlet得启动要稍微延迟一些,如果在这时要做一些业务的操作,启动的前 后顺序是有影响的。
那么在ContextLoaderListener和ContextLoaderServlet中到底做了什么呢?
以ContextLoaderListener为例,我们可以看到
public void contextInitialized(ServletContextEvent event) {
this.contextLoader = createContextLoader();
this.contextLoader.initWebApplicationContext(event.getServletContext());
}
protected ContextLoader createContextLoader() {
return new ContextLoader();
}
ContextLoader 是一个工具类,用来初始化WebApplicationContext,其主要方法就是initWebApplicationContext,我们继续追 踪initWebApplicationContext这个方法(具体代码我不贴出,大家可以看Spring中的源码),我们发现,原来 ContextLoader是把WebApplicationContext(XmlWebApplicationContext是默认实现类)放在了 ServletContext中,ServletContext也是一个“容器”,也是一个类似Map的结构,而 WebApplicationContext在ServletContext中的KEY就是 WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE,我们如果要使用 WebApplicationContext则需要从ServletContext取出,Spring提供了一个 WebApplicationContextUtils类,可以方便的取出WebApplicationContext,只要把 ServletContext传入就可以了。
上面我们介绍了WebApplicationContext在Servlet容器中初始化 的原理,一般的Web应用就可以轻松的使用了,但是,随着Struts的广泛应用,把Struts和Spring整个起来,是一个需要面对的问题, Spring本身也提供了Struts的相关类,主要使用的有 org.springframework.web.struts.ActionSupport,我们只要把自己的Action继承自 ActionSupport,就是可以调用ActionSupport中getWebApplicationContext()的方法取出 WebApplicationContext,但这样一来在Action中,需要取得业务逻辑的地方都要getBean,看上去不够简洁,所以 Spring又提供了另一个方法,用org.springframework.web.struts.ContextLoaderPlugIn,这是一个 Struts的Plug,在Struts启动时加载,对于Action,可以像管理Bean一样来管理,在struts-config.xml中 Action的配置变成类似下面的样子
xml 代码
- <action attribute="aForm" name="aForm" path="/aAction" scope="request" type="org.springframework.web.struts.DelegatingActionProxy">
- <forward name="forward" path="forward.jsp" />
- </action>
注 意type变成了org.springframework.web.struts.DelegatingActionProxy,之后我们需要建立 action-servlet.xml这样的文件,action-servlet.xml符合Spring的spring-beans.dtd标准,在里 面定义类似下面的
xml 代码
- <bean name="/aAction" class="com.web.action.Aaction" singleton="false">
- <property name="businessService">
- <ref bean="businessService"/>
- </property>
- </bean>
com.web.action.Aaction 是Action的实现类,businessService是需要的业务逻辑,Spring会把businessService注入到Action中,在 Action中只要写businessService的get和set方法就可以了,还有一点,action的bean是singleton= "false",即每次新建一个实例,这也解决了Struts中Action的线程同步问题,具体过程是当用户做“/aAction”的HTTP请求(当 然应该是“/aAction.do”),Struts会找到这个Action的对应类 org.springframework.web.struts.DelegatingActionProxy, DelegatingActionProxy是个代理类,它会去找action-servlet.xml文件中“/aAction”对应的真正实现类,然 后把它实例化,同时把需要的业务对象注入,然后执行Action的execute方法。
使用了ContextLoaderPlugIn,在struts-config.xml中变成类似这样配置
xml 代码
- <plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
- <set-property property="contextConfigLocation" value="/WEB-INF/applicationContext.xml,/WEB-INF/action-servlet.xml" />
- </plug-in>
而在web.xml中不再需要ContextLoaderListener或是ContextLoaderServlet。
说 到这里不知道大家会不会有这样的问题,如果使用ContextLoaderPlugIn,如果我们有些程序是脱离Struts的Action环境,我们怎 么处理,比如我们要自定义标记库,在标记库中,我们需要调用Spring管理的业务层逻辑对象,这时候我们就很麻烦,因为只有在action中动态注入业 务逻辑,其他我们似乎不能取得Spring的WebApplicationContext。
别急,我们还是来看一下 ContextLoaderPlugIn的源码(源码不再贴出),我们可以发现,原来ContextLoaderPlugIn仍然是把 WebApplicationContext放在ServletContext中,只是这个KEY不太一样了,这个KEY值为 ContextLoaderPlugIn.SERVLET_CONTEXT_PREFIX+ModuleConfig.getPrefix()(具体请查 看源代码),这下好了,我们知道了WebApplicationContext放在哪里,只要我们在Web应用中能够取到ServletContext也 就能取到WebApplicationContext了:)
Spring是一个很强大的框架,希望大家在使用过程中不断的深入,了解其更多的特性,我在这里抛砖引玉,有什么不对的地方,请大家指出
分享到:
相关推荐
ApplicationContext是Spring框架中的核心组件之一,它是Bean工厂的高级形式,提供了更多企业级的功能。在这个主题中,我们将深入探讨ApplicationContext的内部机制和关键功能。 ApplicationContext的主要职责是加载...
ApplicationContext 是 Spring 框架中的核心组件之一,负责加载和管理应用程序中的 Bean 对象。在 Web 应用程序中,ApplicationContext 的加载机制是非常重要的, Spring 提供了多种方式来加载 ApplicationContext。...
在Spring中,ApplicationContext(应用程序上下文)是容器的核心,负责配置和管理应用中对象的生命周期和依赖关系。在实际开发过程中,经常需要从各个角落获取到这个ApplicationContext对象,以便于能够使用Spring...
然而,BeanFactory缺乏一些高级功能,如国际化支持(i18n)、事件传播、AOP代理以及对Spring的其他核心模块如MessageSource、ApplicationEvent等的集成。因此,对于大型复杂的应用,BeanFactory可能显得不够用。 ...
"Spring核心jar包"是Spring框架的基础,包含了实现Spring核心功能的所有类和接口。本文将深入探讨Spring核心jar包中的关键概念和技术。 1. **IoC(控制反转)与DI(依赖注入)** Spring的核心特性之一是IoC...
总的来说,ApplicationContext 是 Spring 框架的核心组件,它通过不同的实现方式满足不同场景下的需求。理解并熟练掌握各种 ApplicationContext 的使用,能帮助开发者更有效地利用 Spring 框架构建和管理应用。在...
综上所述,`Spring 获得applicationcontext公用方法`涉及了Spring框架中的核心概念,包括`ApplicationContext`的创建、获取以及在实际项目中的使用方式。通过`MyApplicationContextUtil`这样的静态工具类,我们可以...
综上所述,"Spring核心技术文档"包含了Spring框架的关键概念和技术,是学习和掌握Spring的宝贵资源。通过深入阅读和实践,开发者可以有效地提升在企业级Java应用开发中的技能。"E书说明.txt"可能是关于如何使用或...
首先,`applicationContext.xml`是Spring框架的核心配置文件,它定义了Bean的定义、依赖注入关系以及服务的配置。在这个特定的场景中,`applicationContext.xml`将包含与Quartz相关的配置,如Scheduler、Job、...
`ApplicationContext`是Spring的IoC容器接口,它是访问Bean的主要入口点。`BeanFactory`是更基础的容器接口,提供更底层的控制。`BeanDefinition`则存储了Bean的配置信息。 **源码分析** 对于学习和理解Spring框架...
通过学习这些资料,你可以更深入地了解Spring框架的核心原理,从而更好地在项目中运用Spring进行开发。 总的来说,BeanFactory和ApplicationContext是Spring框架中两种不同级别的bean管理工具。BeanFactory是基础,...
#### 四、Spring的核心组件——BeanFactory与ApplicationContext 1. **BeanFactory**:它是Spring框架中最基本的容器接口,负责创建和管理Bean实例。BeanFactory通过工厂模式为应用程序提供服务,允许应用程序请求...
《Spring核心》是Java开发领域中的重要学习资源,尤其对于参加达内IT培训的学员而言,这份内部资料具有极高的价值。Spring框架是Java企业级应用开发的基石,它的核心特性包括依赖注入(Dependency Injection,DI)、...
在Spring框架中,IOC(Inversion of Control,控制反转)是其核心概念之一,它改变了传统应用程序中的对象创建和管理方式。本学习资料主要聚焦于Spring的IOC容器,特别是从最基本的BeanFactory开始,逐步深入理解...
在Spring框架中,`applicationContext.xml`是应用上下文的核心配置文件,用于定义bean的创建、依赖关系以及各种服务的配置。这篇博文“Spring 2.5 - applicationContext.xml提示信息的配置”主要探讨了如何在Spring ...
《Spring 4.3.4核心开发包详解》 Spring框架是Java开发中不可或缺的一部分,其4.3.4版本是2016年12月7日发布的最新GA(General Availability)版本,旨在提供稳定且高效的企业级应用支持。这个核心开发包包含了构建...
Spring Core是Spring框架的基础部分,它包含了Spring的核心组件和基本功能。在深入研究Spring Core的源码之前,我们需要理解一些基本概念和设计原则。 1. **依赖注入(Dependency Injection, DI)**:这是Spring...