`
calmness
  • 浏览: 353977 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
社区版块
存档分类
最新评论

Re: 关于Spring中的父容器和子容器

    博客分类:
  • Java
阅读更多
	protected WebApplicationContext createWebApplicationContext(
			ServletContext servletContext, ApplicationContext parent) throws BeansException {
		Class contextClass = determineContextClass(servletContext);
		if (!ConfigurableWebApplicationContext.class.isAssignableFrom(contextClass)) {
			throw new ApplicationContextException("Custom context class [" + contextClass.getName() +
					"] is not of type ConfigurableWebApplicationContext");
		}

		ConfigurableWebApplicationContext wac =
				(ConfigurableWebApplicationContext) BeanUtils.instantiateClass(contextClass);
		wac.setParent(parent);
		wac.setServletContext(servletContext);
                //获取spring配置文件信息,在web.xml中的contextConfigLocation中
		[color=red]String configLocation = servletContext.getInitParameter(CONFIG_LOCATION_PARAM);
		if (configLocation != null) {
			wac.setConfigLocations(StringUtils.tokenizeToStringArray(configLocation,
					ConfigurableWebApplicationContext.CONFIG_LOCATION_DELIMITERS));
		}

		wac.refresh();  [/color]
		return wac;
	}


这里一次性读取了contextConfigLocation下的所有配置文件,然后wac.refresh()中将这些配置进行解释注册到一个beanfactory中,所以在这里是没有区分父子的,这些配置都会注册到同一个容器当中。

再来看看refresh方法,由于spring内部的类层次比较复杂,在此就直接列出它最终调用的那个refresh方法:


	public void refresh() throws BeansException, IllegalStateException {
		synchronized (this.startupShutdownMonitor) {
			this.startupTime = System.currentTimeMillis();

			//初始化context内部的beanfactory
			[color=red]refreshBeanFactory();[/color]
			ConfigurableListableBeanFactory beanFactory = getBeanFactory();

			// Populate the bean factory with context-specific resource editors.
			ConfigurableBeanFactoryUtils.registerResourceEditors(beanFactory, this);
			beanFactory.registerCustomEditor(Class.class, new ClassEditor(getClassLoader()));

			// Configure the bean factory with context semantics.
			beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));
			beanFactory.ignoreDependencyInterface(ResourceLoaderAware.class);
			beanFactory.ignoreDependencyInterface(ApplicationEventPublisherAware.class);
			beanFactory.ignoreDependencyInterface(MessageSourceAware.class);
			beanFactory.ignoreDependencyInterface(ApplicationContextAware.class);

			// Allows post-processing of the bean factory in context subclasses.
			postProcessBeanFactory(beanFactory);

			// Invoke factory processors registered with the context instance.
			for (Iterator it = getBeanFactoryPostProcessors().iterator(); it.hasNext();) {
				BeanFactoryPostProcessor factoryProcessor = (BeanFactoryPostProcessor) it.next();
				factoryProcessor.postProcessBeanFactory(beanFactory);
			}

			if (logger.isInfoEnabled()) {
				if (getBeanDefinitionCount() == 0) {
					logger.info("No beans defined in application context [" + getDisplayName() + "]");
				}
				else {
					logger.info(getBeanDefinitionCount() + " beans defined in application context [" + getDisplayName() + "]");
				}
			}

			// Invoke factory processors registered as beans in the context.
			invokeBeanFactoryPostProcessors();

			// Register bean processors that intercept bean creation.
			registerBeanPostProcessors();

			// Initialize message source for this context.
			initMessageSource();

			// Initialize event multicaster for this context.
			initApplicationEventMulticaster();

			// Initialize other special beans in specific context subclasses.
			onRefresh();

			// Check for listener beans and register them.
			registerListeners();

			// Instantiate singletons this late to allow them to access the message source.
			beanFactory.preInstantiateSingletons();

			// Last step: publish corresponding event.
			publishEvent(new ContextRefreshedEvent(this));
		}
	}


后面的不管它,只需要看refreshBeanFactory()这个方法,这里实际上就是创建一个新的beanfactory,然后将web.xml中设置的几个配置文件进行解释和注册:
	protected final void refreshBeanFactory() throws BeansException {
		// Shut down previous bean factory, if any.
		if (this.beanFactory != null) {
			this.beanFactory.destroySingletons();
			this.beanFactory = null;
		}

		// Initialize fresh bean factory.
		try {
                        //创建新的beanfactory
			DefaultListableBeanFactory beanFactory = createBeanFactory();
                        //加载bean定义到beanfactory
			[color=red]loadBeanDefinitions(beanFactory);[/color]
			this.beanFactory = beanFactory;
			if (logger.isInfoEnabled()) {
				logger.info("Bean factory for application context [" + getDisplayName() + "]: " + beanFactory);
			}
		}
		catch (IOException ex) {
			throw new ApplicationContextException(
					"I/O error parsing XML document for application context [" + getDisplayName() + "]", ex);
		}
	}


初始化web容器时,实际上只用了一个beanFactory加载了在contextConfigLocation下配置的所有xml,所以这里并无父子容器之分。详细如何解释加载,LZ可自行去看,在此就不多说了。
分享到:
评论

相关推荐

    spring-web-5.2.3.RELEASE和spring-webmvc-5.2.3.RELEASE

    此外,它还提供了对Servlet、Filter和Listener的集成,使得Spring能够与任何Servlet容器(如Tomcat、Jetty)无缝协作。WebSocket API的集成则允许开发者创建实时双向通信的应用。 Spring Web MVC模块(spring-web...

    2017.08 page877 Cloud Native Java_ Designing Re - Josh Long.pdf )

    Spring Boot是Spring框架的一个子项目,目的是简化Spring应用的创建和开发过程。通过使用Spring Boot,开发者可以快速搭建独立的Spring应用,只需要少量的配置。Spring Boot提供了大量的Starters来简化配置过程,...

    解决maven启动Spring项目报错的问题

    出现这个报错的原因是 javax.servlet-api 在运行时将 Spring 容器当成了 Servlet 容器,出现类型转换错误。 解决方法 要解决这个问题,只需要在 pom.xml 文件中修改 javax.servlet-api 的作用域为 provided。下面...

    activiti工作流引擎

    2. 配置Spring:配置Spring容器来管理Activiti,包括数据库连接、事务管理、流程定义的加载等。使用`<bean>`标签注册`ProcessEngineConfiguration`和`ProcessEngine`。 3. 创建流程定义:编写流程定义的XML文件,...

    reis:基于SSM的房产信息系统的实现——毕业设计

    在SSM中,Spring主要负责业务逻辑层的管理,通过IOC容器控制对象的创建和依赖关系,简化了代码的编写和维护。 2. **Spring MVC**:作为Spring的一部分,Spring MVC用于处理Web层的请求和响应。它提供了模型-视图-...

    webwork2.2.7+spring+hibernate分页查询

    - **ContextLoaderListener**:Spring的监听器,用于初始化Spring容器。 - **FilterDispatcher**:WebWork的核心过滤器,处理所有HTTP请求。 ##### 2. DAO 层 (IPersonDAO.java & PersonDAO.java) - **IPersonDAO....

    java常用框架学习笔记

    **XML配置**:Spring最早的配置方式,主要通过XML文件来定义Spring容器中的Bean。 **基于注解的配置**:随着Java 5的发布,Spring开始支持基于注解的配置方式,这种方式更加简洁,减少了XML配置的工作量。 **Java...

    程序员文摘第56期-精选最有价值的文章

    - Docker的安装:Docker是一种流行的容器化技术,用于打包应用和其依赖环境。离线安装通常涉及下载Docker的稳定版本tgz文件,然后在Linux环境中通过脚本执行安装。在线安装则需要配置yum仓库并使用yum install命令...

    程序员文摘第21期-精选最有价值的文章

    - Python正则表达式修饰符:re.M是Python中的正则表达式修饰符,用于多行匹配模式,使得^和$可以匹配每一行的开始和结束。 3. **后端开发**: - SpringCache与Redis整合:SpringCache是Spring框架的一部分,用于...

    activiti6.0官方英文文档,需要自取 免费!免费!免费!

    - **初始化**:通过Spring容器初始化ProcessEngine实例。 ##### 5.2 事务 - **事务管理**:利用Spring的事务管理器来处理Activiti中的事务。 - **传播行为**:定义事务的传播行为。 ##### 5.3 表达式 - **Spring ...

    程序员文摘第45期-精选最有价值的文章

    在本期的《程序员文摘》中,我们涵盖了多个IT领域的精彩文章和教程,包括云原生、开发与运维、后端、网络安全、IoT、微服务、开发工具、人工智能、数据库、云平台、大数据和云计算等。以下是这些文章中涉及的知识点...

    程序员文摘第25期-精选最有价值的文章

    在本文摘中,我们看到了一系列关于编程、开发、运维和安全相关的文章和教程。以下是一些关键知识点的详细说明: 1. **云原生**:云原生是一种构建和运行应用程序的方法,它充分利用了云计算的优势,如弹性、可移植...

    程序员文摘第53期-精选最有价值的文章

    - `Python正则表达式修饰符re.M`:在Python中,正则表达式修饰符`re.M`用于使匹配模式多行化,即`^`和`$`可以匹配每一行的开头和结尾。 - `SpringCache整合Redis`:SpringCache是Spring框架中的缓存抽象,整合Redis...

    java版商城源码-News-app:新闻提要网络应用程序上的一个小型实验性spring-boot项目

    java版商城源码News-app:一个基本的新闻提要网络应用程序(2020 年 6 月 2 日编辑) 所有功能都可能更新 概述 新闻应用程序是一个小型示例 spring-boot 项目,针对新闻提要 ...应用程序中的服务。...Re

    程序员面试资料汇总

    在程序员的面试准备过程中,掌握相关的技术和面试技巧至关重要。这份"程序员面试资料汇总"涵盖了大量有助于求职者提升自我、成功获得理想offer的信息。下面将详细阐述其中可能包含的知识点: 一、编程语言基础 1. ...

    基于SpringBoot+MyBatis实现的商城管理系统,采用Docker容器化部署

    `mall`项目是一套电商系统,包括前台商城系统及后台管理系统,基于SpringBoot+MyBatis实现,采用Docker容器化部署。前台商城系统包含首页门户、商品推荐、商品搜索、商品展示、购物车、订单流程、会员中心、客户服务...

    ColocDutyBack:Le back de notre应用程序ColocDuty

    9. **容器化和微服务**:可能利用Docker进行服务的容器化,通过Kubernetes或Docker Compose进行集群管理和部署,以实现高可用和可扩展性。 10. **版本控制**:项目可能使用Git进行版本控制,GitHub或GitLab作为代码...

    程序员文摘第59期-精选最有价值的文章

    Docker的安装是云原生开发中的基础步骤,它提供了一个轻量级的容器化平台,使得应用可以独立于操作系统运行,便于部署和移植。 2. **开发与运维**:Python的正则表达式修饰符`re.M`用于多行匹配,它使`^`和`$`能够...

    BackEndMagTech:Servidor daaplicaçãoda rede社交MagTech

    【标题】"BackEndMagTech:Servidor daaplicaçãoda rede社交MagTech" 提供的是关于构建社交网络应用的后端技术信息。在这一领域,后端开发是核心部分,它负责处理数据存储、业务逻辑以及与前端交互等功能。MagTech...

    程序员文摘第71期-精选最有价值的文章

    本文将从这些领域中挑选出一些关键的知识点,进行详细的解释和分析。 云原生 * Docker的安装:Docker是一种流行的容器化工具,它可以帮助开发者快速构建、部署和管理应用程序。安装Docker是一件非常重要的事情,它...

Global site tag (gtag.js) - Google Analytics