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 Boot是Spring框架的一个子项目,目的是简化Spring应用的创建和开发过程。通过使用Spring Boot,开发者可以快速搭建独立的Spring应用,只需要少量的配置。Spring Boot提供了大量的Starters来简化配置过程,...
出现这个报错的原因是 javax.servlet-api 在运行时将 Spring 容器当成了 Servlet 容器,出现类型转换错误。 解决方法 要解决这个问题,只需要在 pom.xml 文件中修改 javax.servlet-api 的作用域为 provided。下面...
2. 配置Spring:配置Spring容器来管理Activiti,包括数据库连接、事务管理、流程定义的加载等。使用`<bean>`标签注册`ProcessEngineConfiguration`和`ProcessEngine`。 3. 创建流程定义:编写流程定义的XML文件,...
在SSM中,Spring主要负责业务逻辑层的管理,通过IOC容器控制对象的创建和依赖关系,简化了代码的编写和维护。 2. **Spring MVC**:作为Spring的一部分,Spring MVC用于处理Web层的请求和响应。它提供了模型-视图-...
- **ContextLoaderListener**:Spring的监听器,用于初始化Spring容器。 - **FilterDispatcher**:WebWork的核心过滤器,处理所有HTTP请求。 ##### 2. DAO 层 (IPersonDAO.java & PersonDAO.java) - **IPersonDAO....
**XML配置**:Spring最早的配置方式,主要通过XML文件来定义Spring容器中的Bean。 **基于注解的配置**:随着Java 5的发布,Spring开始支持基于注解的配置方式,这种方式更加简洁,减少了XML配置的工作量。 **Java...
- Docker的安装:Docker是一种流行的容器化技术,用于打包应用和其依赖环境。离线安装通常涉及下载Docker的稳定版本tgz文件,然后在Linux环境中通过脚本执行安装。在线安装则需要配置yum仓库并使用yum install命令...
- Python正则表达式修饰符:re.M是Python中的正则表达式修饰符,用于多行匹配模式,使得^和$可以匹配每一行的开始和结束。 3. **后端开发**: - SpringCache与Redis整合:SpringCache是Spring框架的一部分,用于...
- **初始化**:通过Spring容器初始化ProcessEngine实例。 ##### 5.2 事务 - **事务管理**:利用Spring的事务管理器来处理Activiti中的事务。 - **传播行为**:定义事务的传播行为。 ##### 5.3 表达式 - **Spring ...
在本期的《程序员文摘》中,我们涵盖了多个IT领域的精彩文章和教程,包括云原生、开发与运维、后端、网络安全、IoT、微服务、开发工具、人工智能、数据库、云平台、大数据和云计算等。以下是这些文章中涉及的知识点...
在本文摘中,我们看到了一系列关于编程、开发、运维和安全相关的文章和教程。以下是一些关键知识点的详细说明: 1. **云原生**:云原生是一种构建和运行应用程序的方法,它充分利用了云计算的优势,如弹性、可移植...
- `Python正则表达式修饰符re.M`:在Python中,正则表达式修饰符`re.M`用于使匹配模式多行化,即`^`和`$`可以匹配每一行的开头和结尾。 - `SpringCache整合Redis`:SpringCache是Spring框架中的缓存抽象,整合Redis...
java版商城源码News-app:一个基本的新闻提要网络应用程序(2020 年 6 月 2 日编辑) 所有功能都可能更新 概述 新闻应用程序是一个小型示例 spring-boot 项目,针对新闻提要 ...应用程序中的服务。...Re
在程序员的面试准备过程中,掌握相关的技术和面试技巧至关重要。这份"程序员面试资料汇总"涵盖了大量有助于求职者提升自我、成功获得理想offer的信息。下面将详细阐述其中可能包含的知识点: 一、编程语言基础 1. ...
`mall`项目是一套电商系统,包括前台商城系统及后台管理系统,基于SpringBoot+MyBatis实现,采用Docker容器化部署。前台商城系统包含首页门户、商品推荐、商品搜索、商品展示、购物车、订单流程、会员中心、客户服务...
9. **容器化和微服务**:可能利用Docker进行服务的容器化,通过Kubernetes或Docker Compose进行集群管理和部署,以实现高可用和可扩展性。 10. **版本控制**:项目可能使用Git进行版本控制,GitHub或GitLab作为代码...
Docker的安装是云原生开发中的基础步骤,它提供了一个轻量级的容器化平台,使得应用可以独立于操作系统运行,便于部署和移植。 2. **开发与运维**:Python的正则表达式修饰符`re.M`用于多行匹配,它使`^`和`$`能够...
【标题】"BackEndMagTech:Servidor daaplicaçãoda rede社交MagTech" 提供的是关于构建社交网络应用的后端技术信息。在这一领域,后端开发是核心部分,它负责处理数据存储、业务逻辑以及与前端交互等功能。MagTech...
本文将从这些领域中挑选出一些关键的知识点,进行详细的解释和分析。 云原生 * Docker的安装:Docker是一种流行的容器化工具,它可以帮助开发者快速构建、部署和管理应用程序。安装Docker是一件非常重要的事情,它...
8. **Spring框架**:理解依赖注入、AOP(面向切面编程),以及Spring Boot和Spring Cloud的应用。 9. **数据库知识**:SQL查询语言,事务管理,以及JDBC的操作。 10. **网络编程**:TCP/IP协议,Socket编程,以及...