`
jokeymzx
  • 浏览: 51724 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

阅读更多
spring参考文档中很多地方提到了父容器和子容器的概念,在使用的时候往往是将有关的xml配置文件放在一起配置,如:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/applicationContext.xml,
    /     WEB-INF/classes/com/**/*.xml,
/WEB-INF/classes/com/**/*.xml,
</param-value>
</context-param>
那么在程序运行时,怎么区分父容器和子容器,是按照配置文件的顺序吗?
分享到:
评论
2 楼 calmness 2007-05-22  
	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可自行去看,在此就不多说了。
1 楼 xly_971223 2007-05-22  
我的理解是:随便从那个文件加载都可以,遇到依赖的bean就去查找然后加载 如此递归直到所有的bean加载完毕。
没读过spring源码 自己理解的
可以去看看源码就明白

相关推荐

    Spring和SpringMVC父子容器关系

    在父子容器的关系中,父容器拥有全局的bean定义,而子容器可以拥有自己特定的bean定义,同时继承父容器的bean。如果子容器中有与父容器同名的bean,那么子容器的bean将会覆盖父容器的bean,这就是所谓的“局部覆盖...

    spring容器启动和关闭时事件监听

    spring容器启动和关闭时事件监听;spring容器启动和关闭时事件监听;spring容器启动和关闭时事件监听

    spring动态向容器中添加bean和删除指定bean.md

    spring动态向容器中添加bean和删除指定bean,不需要重启应用

    在非spring注解类中使用spring容器中的bean_普通类中使用yml配置文件中的配置信息

    然而,在某些情况下,我们可能需要在非Spring注解的类中访问Spring容器中的Bean,或者在这些类中使用YAML配置文件中的配置信息。本篇将详细介绍如何在这样的场景下实现这一目标。 首先,让我们来理解如何在非Spring...

    Spring简单模拟Spring容器

    标题中的“Spring简单模拟Spring容器”意味着我们将探讨Spring框架的核心特性——IoC(Inversion of Control,控制反转)和DI(Dependency Injection,依赖注入),以及如何通过编程方式模拟Spring容器的工作原理。...

    Spring之核心容器bean

    在Spring中,bean是一个由容器管理的对象,它的实例化、初始化、装配和销毁都是由Spring容器控制的。你可以通过XML、注解或者Java配置类来定义bean。例如,一个简单的XML配置如下: ```xml ``` 这里,`myBean`...

    spring Ioc容器配置

    spring Ioc容器配置 IOC容器数据源配置 &lt;!-- 配置数据源 --&gt; destroy-method="close"&gt; &lt;value&gt;org.gjt.mm.mysql.Driver &lt;value&gt;jdbc:mysql://localhost:3306/demo &lt;value&gt;root ...

    Spring的IoC容器初始化源码解析

    它是所有Spring容器的基类,为其他容器提供了基本的服务和功能。 ##### 3.2 ApplicationContext介绍 `ApplicationContext`是在`BeanFactory`基础上的增强版本,除了继承了`BeanFactory`的所有功能之外,还提供了...

    简单Spring容器实现

    本主题将深入探讨“简单Spring容器实现”,基于提供的标签“源码”和“工具”,我们将聚焦于Spring容器的原理及其简易实现。下面,我们先来理解Spring容器的核心概念,然后逐步探索其内部机制,并通过一个名为...

    获取Spring容器

    在这个类中,我们定义了一个静态方法`getBean`,通过传入Bean的名称,可以从Spring容器中获取对应的Bean实例。 ##### 3. 通过公共方法获取其他对象 一旦`ApplicationContextUtil`被配置并初始化,就可以通过调用其...

    获取spring容器的方法

    掌握如何获取Spring容器对于管理和访问其管理的bean至关重要。本文将深入探讨几种常见的获取Spring容器的方法,包括使用`ApplicationContext`、通过`ServletContext`、利用`ApplicationObjectSupport`、`...

    模拟Spring的IoC容器实现注解自动装配

    在Spring框架中,IoC(Inversion of Control)容器是其核心特性之一,它负责管理对象的生命周期和依赖关系。IoC容器通过控制反转的概念,将对象的创建和依赖关系的配置从应用代码中分离出来,使代码更加灵活、可测试...

    Spring容器的通俗理解及简单写法

    在Java开发中,Spring容器(也称为ApplicationContext或BeanFactory)扮演着重要角色,它通过控制反转(Inversion of Control, IOC)和依赖注入(Dependency Injection, DI)的概念,帮助开发者构建松散耦合的系统。...

    Spring IOC容器实现分析.pdf 下载

    在Spring框架中,IOC容器负责管理对象的生命周期和依赖关系,通过配置文件或注解来定义对象及其依赖,实现了解耦合。 二、Spring IOC容器的组成 Spring的IOC容器主要由BeanFactory和ApplicationContext两个接口...

    详解spring boot容器加载完后执行特定操作

    在 Spring Boot 应用程序中,容器加载完成后,框架会触发 ContextRefreshedEvent 事件,该事件表明容器已经加载完成,可以执行特定操作了。我们可以创建一个实现 ApplicationListener 接口的类,用于监听 ...

    Spring和SpringMVC父子容器关系初窥(小结)

    在一个项目中引入Spring和SpringMVC这两个框架时,它们之间存在着父子容器关系,Spring是父容器,SpringMVC是其子容器。 在Spring父容器中注册的Bean对于SpringMVC容器中是可见的,而在SpringMVC容器中注册的Bean...

    Spring容器 .ppt

    Spring容器是Spring框架的核心组成部分,它负责管理对象的生命周期和对象之间的依赖关系。Spring容器的主要职责是读取配置元数据,创建和组装Bean,并提供Bean的完整生命周期管理。本篇内容将深入探讨Spring容器的...

    spring的父子容器及配置详解

    在父子容器环境中,当子容器中的Bean需要依赖父容器中的Bean时,Spring会自动处理依赖注入。例如,通过`@Autowired`注解或者使用`@Resource`注解指定Bean名称,Spring能够正确地找到并注入父容器中的Bean。 总之,...

Global site tag (gtag.js) - Google Analytics