Spring源代码解析(二):IOC容器在web容器中的启动

以下引用自博客:http://jiwenke-spring.blogspot.com/ 

上面我们分析了IOC容器本身的实现,下面我们看看在典型的web环境中,Spring IOC 容器是怎样被载入和起作用的。

简单的说,在web容器中,通过ServletContext为Spring的IOC容器提供宿主环境,对 应的建立起一个IOC容器的体系。其中,首先需要建立的是根上下文,这个上下文持有的 对象可以有业务对象,数据存取对象,资源,事物管理器等各种中间层对象。在这个上下 文的基础上,和web MVC相关还会有一个上下文来保存控制器之类的MVC对象,这样就构成 了一个层次化的上下文结构。在web容器中启动Spring应用程序就是一个建立这个上下文 体系的过程。Spring为web应用提供了上下文的扩展接口

WebApplicationContext:

代码

public interface WebApplicationContext extends ApplicationContext {
   //这里定义的常量用于在ServletContext中存取根上下文
   String ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE = WebApplicationContext.class.getName() + ".ROOT";
   ......
   //对WebApplicationContext来说,需要得到Web容器的ServletContext
   ServletContext getServletContext();
}

而一般的启动过程,Spring会使用一个默认的实现,XmlWebApplicationContext - 这 个上下文实现作为在web容器中的根上下文容器被建立起来,具体的建立过程在下面我们 会详细分析。

代码

public class XmlWebApplicationContext extends AbstractRefreshableWebApplicationContext {
   /** 这是和web部署相关的位置信息,用来作为默认的根上下文bean定义信息的存 放位置*/
   public static final String DEFAULT_CONFIG_LOCATION = "/WEB- INF/applicationContext.xml";
   public static final String DEFAULT_CONFIG_LOCATION_PREFIX = "/WEB- INF/";
   public static final String DEFAULT_CONFIG_LOCATION_SUFFIX = ".xml";
   //我们又看到了熟悉的loadBeanDefinition,就像我们前面对IOC容器的分析中一 样,这个加载工程在容器的refresh()的时候启动。
   protected void loadBeanDefinitions(DefaultListableBeanFactory beanFactory) throws IOException {
     //对于XmlWebApplicationContext,当然使用的是XmlBeanDefinitionReader 来对bean定义信息来进行解析
     XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(beanFactory);
     beanDefinitionReader.setResourceLoader(this);
     beanDefinitionReader.setEntityResolver(new ResourceEntityResolver (this));
     initBeanDefinitionReader(beanDefinitionReader);
     loadBeanDefinitions(beanDefinitionReader);
   }
   protected void initBeanDefinitionReader(XmlBeanDefinitionReader beanDefinitionReader) {
   }
   //使用XmlBeanDefinitionReader来读入bean定义信息
   protected void loadBeanDefinitions(XmlBeanDefinitionReader reader) throws BeansException, IOException {
     String[] configLocations = getConfigLocations();
     if (configLocations != null) {
       for (int i = 0; i < configLocations.length; i++) {
         reader.loadBeanDefinitions(configLocations[i]);
       }
     }
   }
   //这里取得bean定义信息位置,默认的地方是/WEB- INF/applicationContext.xml
   protected String[] getDefaultConfigLocations() {
     if (getNamespace() != null) {
       return new String[] {DEFAULT_CONFIG_LOCATION_PREFIX + getNamespace() + DEFAULT_CONFIG_LOCATION_SUFFIX};
     }
     else {
       return new String[] {DEFAULT_CONFIG_LOCATION};
     }
   }
}

时间: 2024-10-29 11:05:18

Spring源代码解析(二):IOC容器在web容器中的启动的相关文章

基于纯Java代码的Spring容器和Web容器零配置的思考和实现(3) - 使用配置

经过<基于纯Java代码的Spring容器和Web容器零配置的思考和实现(1) - 数据源与事务管理>和<基于纯Java代码的Spring容器和Web容器零配置的思考和实现(2) - 静态资源.视图和消息器>两篇博文的介绍,我们已经配置好了Spring所需的基本配置.在这边博文中,我们将介绍怎么使用这些配置到实际项目中,并将web.xml文件替换为一个Java类. 我们使用Java代码来配置Spring,目的就是使我们的这些配置能够复用,对于这些配置的复用,我们采用继承和引入来实现

Nutch index源代码解析二)

Nutch index源代码解析二) 博客分类: 大数据处理研究 Ntuch solrhadoop爬虫 接着上篇文档~~~~~ 上篇文章写到,Nutch采用一个MR对爬取下来的文档进行清洗和封装成一个action列表. 接下来介绍怎么爬取下来的数据如何推送给solr. ----------------------------------------------------华丽的分割线--------------------------------------------- Ntuch自定义了一个

Spring源代码解析(四):Spring MVC

下面我们对Spring MVC框架代码进行分析,对于webApplicationContext的相关分析可 以参见以前的文档,我们这里着重分析Spring Web MVC框架的实现.我们从分析 DispatcherServlet入手: 代码 //这里是对DispatcherServlet的初始化方法,根据名字我们很方面的看到对各 个Spring MVC主要元素的初始化 protected void initFrameworkServlet() throws ServletException, B

Web APi 2.0优点和特点?在Web APi中如何启动Session状态?

前言 曾几何时,微软基于Web服务技术给出最流行的基于XML且以扩展名为.asmx结尾的Web Service,此服务在.NET Framework中风靡一时同时也被.NET业界同仁所青睐,几年后在此基础上又扩展成为了WCF,基于SOAP协议,基于WCF标准需要一些配置上的改变.现如今,大势所趋我们只需要HTTP协议以及更加优美的JSON格式,这时将不得不出现一个更加轻量级的Web服务技术.当然,Web Service和WCF虽然有其局限性但是其仍被许多企业所广泛应用,说明一时半会还不会被淘汰,

Spring源代码解析(一):IOC容器

在认真学习Rod.Johnson的三部曲之一:< >,顺便也看了看源代码想知道个究竟,抛砖引玉,有兴趣的同志一起讨论研究吧! 以下内容引自博客:http://jiwenke-spring.blogspot.com/,欢迎指导:) 在Spring中,IOC容器的重要地位我们就不多说了,对于Spring的使用者而言,IOC容器实际上是什么呢?我们可以说BeanFactory就是我们看到的IoC容器,当然了Spring为我们准备了许多种IoC容器来使用,这样可以方便我们从不同的层面,不同的资源位置,

Spring源代码解析(六):Spring声明式事务处理

我们看看Spring中的事务处理的代码,使用Spring管理事务有声明式和编程式两种方 式,声明式事务处理通过AOP的实现把事物管理代码作为方面封装来横向插入到业务代码 中,使得事务管理代码和业务代码解藕.在这种方式我们结合IoC容器和Spirng已有的 FactoryBean来对事务管理进行属性配置,比如传播行为,隔离级别等.其中最简单的方 式就是通过配置TransactionProxyFactoryBean来实现声明式事物: 在整个源代码分析中,我们可以大致可以看到Spring实现声明式事物

Spring源代码解析(九):Spring Acegi框架鉴权的实现

简单分析一下Spring Acegi的源代码实现: Servlet.Filter的实现AuthenticationProcessingFilter启动Web页面的验证过程 - 在AbstractProcessingFilter定义了整个验证过程的模板: Java代码 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, Servle

Spring源代码解析(八):Spring驱动Hibernate的实现

O/R工具出现之后,简化了许多复杂的信息持久化的开发.Spring应用开发者可以通过 Spring提供的O/R方案更方便的使用各种持久化工具,比如Hibernate:下面我们就 Spring+Hibernate中的Spring实现做一个简单的剖析. Spring对Hinberanate的配置是通过LocalSessionFactoryBean来完成的,这是一个工 厂Bean的实现,在基类AbstractSessionFactoryBean中: Java代码 /** * 这是FactoryBean

Spring源代码解析(七):Spring AOP中对拦截器调用的实现

前面我们分析了Spring AOP实现中得到Proxy对象的过程,下面我们看看在Spring AOP 中拦截器链是怎样被调用的,也就是Proxy模式是怎样起作用的,或者说Spring是怎样为 我们提供AOP功能的: 在JdkDynamicAopProxy中生成Proxy对象的时候: Java代码 return Proxy.newProxyInstance(classLoader, proxiedInterfaces, this); 这里的this参数对应的是InvocationHandler对象