下面就是我们要讨论的问题: 在web应用根上下文建立的时候,是可以对它设置父上下文的,在ContextLoader中: [code] protected ApplicationContext loadParentContext(ServletContext servletContext) throws BeansException { ApplicationContext parentContext = null; //这里读取在web.xml中配置的参数 String locatorFactorySelector = servletContext.getInitParameter(LOCATOR_FACTORY_SELECTOR_PARAM); String parentContextKey = servletContext.getInitParameter(LOCATOR_FACTORY_KEY_PARAM); //这里得到一个Locator实际上是一个管理IOC容器的容器 if (locatorFactorySelector != null) { BeanFactoryLocator locator = ContextSingletonBeanFactoryLocator.getInstance(locatorFactorySelector); if (logger.isInfoEnabled()) { logger.info("Getting parent context definition: using parent context key of '" + parentContextKey + "' with BeanFactoryLocator"); } //这里从Locator容器中得到需要的IOC容器作为根上下文的父上下文,这个IOC容器的取得通过配置LOCATOR_FACTORY_KEY_PARAM属性 this.parentContextRef = locator.useBeanFactory(parentContextKey); parentContext = (ApplicationContext) this.parentContextRef.getFactory(); } return parentContext; } [/code] 问题在这个BeanFactory的作用上,看到在reference guide和Java Doc中的说明: 在reference3.9中提到这个Selector的使用: [i]As another example, in a complex J2EE apps with multiple layers (various JAR files, EJBs, and WAR files packaged as an EAR), with each layer having its own Spring IoC container definition (effectively forming a hierarchy), the preferred approach when there is only one web-app (WAR) in the top hierarchy is to simply create one composite Spring IoC container from the multiple XML definition files from each layer. All of the various Spring IoC container implementations may be constructed from multiple definition files in this fashion. However, if there are multiple sibling web-applications at the root of the hierarchy, it is problematic to create a Spring IoC container for each web-application which consists of mostly identical bean definitions from lower layers, as there may be issues due to increased memory usage, issues with creating multiple copies of beans which take a long time to initialize (e.g. a Hibernate SessionFactory), and possible issues due to side-effects. As an alternative, classes such as ContextSingletonBeanFactoryLocator or SingletonBeanFactoryLocator may be used to demand-load multiple hierarchical (that is one container is the parent of another) Spring IoC container instances in a singleton fashion, which may then be used as the parents of the web-application Spring IoC container instances. The result is that bean definitions for lower layers are loaded only as needed, and loaded only once. [/i] 这里的大致意思是说如果在一个复杂的J2EE应用中怎样简化IOC配置的问题,可以通过这个Locator为多个web应用或者是多层IOC定义一个顶层的IOC容器,这样的话可以只用对多个配置文件读取一次,同时这个顶层IOC容器中管理的bean都是可以共享的 - 而且这个顶层的IOC容器是以单例形式被使用的。在JAVA Doc中给出了使用的例子: 首先配置在顶层IOC需要的定义文件,实际上是配置了一个IOC容器作为这个Locator的bean: [code] <beans> <bean class="org.springframework.context.support.ClassPathXmlApplicationContext" id="com.mycompany.myapp"> <constructor-arg>
<list> <value>com/mycompany/myapp/util/applicationContext.xml</value> <value>com/mycompany/myapp/dataaccess/applicationContext.xml</value> <value>com/mycompany/myapp/dataaccess/services.xml</value> </list>
</constructor-arg> </bean> </beans> [/code] 然后就是对这个Locator的使用,如果去看一下ContextLoader的代码也是这样使用的: [code] BeanFactoryLocator bfl = SingletonBeanFactoryLocator.getInstance(); BeanFactoryReference bf = bfl.useBeanFactory("com.mycompany.myapp"); // now use some bean from factory MyClass zed = bf.getFactory().getBean("mybean"); [/code] 在ContextLoader中的使用是这样的: [code] if (locatorFactorySelector != null) { BeanFactoryLocator locator = ContextSingletonBeanFactoryLocator.getInstance(locatorFactorySelector); if (logger.isInfoEnabled()) { logger.info("Getting parent context definition: using parent context key of '" + parentContextKey + "' with BeanFactoryLocator"); } //这里从Locator容器中得到需要的IOC容器作为根上下文的父上下文,这个IOC容器的取得通过配置LOCATOR_FACTORY_KEY_PARAM属性 this.parentContextRef = locator.useBeanFactory(parentContextKey); parentContext = (ApplicationContext) this.parentContextRef.getFactory(); } [/code] 从这点看,这个管理IOC容器的容器还是很方便的使用的 - 而且是单例的形式,这样为我们管理那些公用的bean提供了很多便利, 换句话说,如果灵活使用的话,我们可以通过这个管理容器的容器根据需要选择我们的需要到的容器,也就是选择需要的bean - 不一定在顶层去作为根上下文的父上下文。 但经过讨论,我还是不太明白这个Locator怎样能够在跨web应用做到一个单例的使用?因为一个web应用启动时就会维护一个自己的ContextLoader,这里就会有一个自己的Locator,也就是以后在这个应用的范围内使用这个Locator,所以难道这个Locator只能在一个Web应用中使用来管理IOC容器?但是reference guide中的这段话又怎么理解呢? [i] However, if there are multiple sibling web-applications at the root of the hierarchy, it is problematic to create a Spring IoC container for each web-application which consists of mostly identical bean definitions from lower layers,as there may be issues due to increased memory usage, issues with creating multiple copies of beans which take a long time to initialize (e.g. a Hibernate SessionFactory), and possible issues due to side-effects.[/i] 难道这个Locator的作用范围的确只能在一个web应用中为多层次的IOC定义提供服务?
分享到:
相关推荐
在Spring源代码解析的第一部分,我们将聚焦于IOC容器,特别是BeanFactory接口,它是所有Spring容器的基础。 BeanFactory接口是Spring的基石,它定义了基本的容器操作,如获取Bean、检查Bean是否存在、确定Bean的...
Spring源代码解析(二):IoC容器在Web容器中的启动 Spring源代码解析(三):Spring JDBC Spring源代码解析(四):Spring MVC Spring源代码解析(五):Spring AOP获取Proxy Spring源代码解析(六):Spring声明式事务...
当我们在Web环境中运行Spring应用时,IoC容器需要在Web容器(如Tomcat、Jetty等)中启动并运行。这个过程涉及到一系列的初始化步骤,确保Spring能够正确地与Web容器集成。 首先,`WebApplicationContext`是`...
Spring源代码解析2:IoC容器在Web容器中的启动.doc Spring源代码解析3:Spring JDBC .doc Spring源代码解析4:Spring MVC .doc Spring源代码解析5:Spring AOP获取Proxy .doc Spring源代码解析6:Spring声明式事务...
Spring源代码解析2:IoC容器在Web容器中的启动;Spring源代码解析3:Spring JDBC ; Spring源代码解析4:Spring MVC ;Spring源代码解析5:Spring AOP获取Proxy;Spring源代码解析6:Spring声明式事务处理 ; ...
2. **Web环境下的IOC容器启动**:"spring源代码解析(二):IOC容器在web中启动.doc"涵盖了在Web应用中初始化Spring容器的过程,包括ApplicationContext的创建、DispatcherServlet的配置以及如何在Web环境中注入bean...
Spring源代码解析2:IoC容器在Web容器中的启动;Spring源代码解析3:Spring JDBC ; Spring源代码解析4:Spring MVC ;Spring源代码解析5:Spring AOP获取Proxy;Spring源代码解析6:Spring声明式事务处理 ; ...
Spring源代码解析(二):ioc容器在Web容器中的启动.doc Spring源代码分析(三):Spring JDBC.doc Spring源代码解析(四):Spring MVC.doc Spring源代码解析(五):Spring AOP获取Proxy.doc Spring源代码解析(六):...
spring Ioc容器配置 IOC容器数据源配置 <!-- 配置数据源 --> destroy-method="close"> <value>org.gjt.mm.mysql.Driver <value>jdbc:mysql://localhost:3306/demo <value>root ...
Spring 中 IoC 优点与缺点解析 IoC(Inversion of Control)是 Spring 框架中的一种设计模式,它的主要思想是将对象的创建和管理交给容器,从而解耦合对象之间的依赖关系。今天,我们将详细解析 IoC 的优点和缺点。 ...
在Spring框架中,IOC容器负责管理对象的生命周期和依赖关系,通过配置文件或注解来定义对象及其依赖,实现了解耦合。 二、Spring IOC容器的组成 Spring的IOC容器主要由BeanFactory和ApplicationContext两个接口...
标题 "Spring3.1.3 Ioc在Web容器中的建立" 涉及的是Spring框架的一个关键特性——依赖注入(Dependency Injection,简称DI),以及如何在Web应用环境中配置和使用它。Spring是Java开发中最流行的轻量级框架之一,...
Spring5 框架 ---- IOC容器 ---- 代码 Spring5 框架 ---- IOC容器 ---- 代码 Spring5 框架 ---- IOC容器 ---- 代码 Spring5 框架 ---- IOC容器 ---- 代码 Spring5 框架 ---- IOC容器 ---- 代码 Spring5 框架 ---- ...
在本篇讨论中,我们将深入探究Spring框架2.5.6版本中的IoC(Inversion of Control,控制反转)容器。IoC是Spring的核心特性,它使得开发者能够更灵活地管理对象及其依赖关系,从而降低了代码间的耦合度。本文将通过...
### Spring的IoC容器初始化源码解析 #### 一、Spring框架的核心——IoC容器 Spring框架是一个开源的轻量级Java开发框架,其核心功能是IoC(Inversion of Control,控制反转)容器和AOP(Aspect Oriented ...
《Spring源代码解析》 Spring框架作为Java领域最流行的开源框架之一,它的设计思想和实现方式一直是广大开发者关注的焦点。深入理解Spring的源代码,能够帮助我们更好地掌握其工作原理,提高我们的开发效率和代码...