`

spring中父子容器的实现

 
阅读更多

转载:http://blog.csdn.net/fenglibing/article/details/8597789

 

Spring中父子容器的实现实例Spring的父子容器可以通过ConfigurableApplicationContext或ConfigurableBeanFactory来实现,这两个接口中分别有setParent及setParentBeanFactory方法,可以与当前的子容器进行父子容器关联,这个时候子容器就可以引用父容器中的bean,但是父容器是不能够引用子容器中的bean的,并且各个子容器中定义的bean是互不可见的,这样也可以避免因为不同的插件定义了相同的bean而带来的麻烦。应用场景包括插件或组件的接入,只需要对方提供JAR即可,由父容器进行引导,各个子容器再完成自己的应该完成的工作即可。

以下是一个通过ConfigurableApplicationContext来实现的实例。

1、父容器需要的几个文件:

1)、Runner.java

[java] view plaincopy
 
  1. //这个类负责启动父容器  
  2. public class Runner {  
  3.     public static void main(String[] args){  
  4.         ApplicationContext context = new ClassPathXmlApplicationContext("classpath*:/spring1.xml");  
  5.     }  
  6. }  

2)、ParentClass 这个类主要用于测试子容器是否可以获取父容器中定义的bean

[java] view plaincopy
 
  1. public class ParentClass{  
  2.     public void print(){  
  3.         System.out.println("This is parent class.");  
  4.     }  
  5. }  

3)、PluginLoader 这个类用于对子容器的加载,建立父子容器关系

[java] view plaincopy
 
  1. public class PluginLoader implements ApplicationContextAware {  
  2.     ApplicationContext parentApplicationContext;  
  3.     ConfigurableApplicationContext childContext;  
  4.   
  5.     public void load() {  
  6.       //扫描所有classpath下面的以plugin_开头spring的配置文件进行装配,这里约定所有的子容器插件都必须有一个以plugin_开头的配置文件,并通过这个文件被父容器加载  
  7.         childContext = new ClassPathXmlApplicationContext("classpath*:/plugin_*.xml");  
  8.         childContext.setParent(parentApplicationContext);  
  9.         childContext.refresh();  
  10.     }  
  11.   
  12.     public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {  
  13.         this.parentApplicationContext = applicationContext;  
  14.     }  
  15. }  

4)、spring1.xml

 

[html] view plaincopy
 
  1. <bean id="parentClass" class="com.test1.ParentClass"></bean>  
  2. <bean id="pluginLoader" class="com.test1.PluginLoader" init-method="load"></bean>  



 

简单的父容器就只需要这么几个类了。

2、子容器1需要的几个文件

我准备了两个子容器,并加了互相测试调用的的测试,看子容器是否可以引用另外一个子窗口中的bean,不过因为两个子容器的实现完全相同,只是由1改成2就可以了,以下就只贴出子容器1需要的代码,子容器2的代码类似。

1)、plugin_1.xml 这个类是约定好必须存在的,由容器进行引导

 

[html] view plaincopy
 
  1. <pre name="code" class="html"><bean id="childContext1" class="com.test1.child.ChildContext1"></bean>  

 

2)、ChildContext1.java 加载自己容器中所有的配置,并与父容器建立父子容器关系

[java] view plaincopy
 
  1. public class ChildContext1 implements ApplicationContextAware {  
  2.       
  3.     ApplicationContext parentApplicationContext;  
  4.   
  5.     public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {  
  6.       //父容器中没有建立父子容器关系之前,是获取不到parent的,只有父容器执行refresh方法后,第二次初使化子容器才会获取得到  
  7.       //也就是第一次的初使化就不执行了,等父容器中建立好父子容器关系后再进行初使化,因为子容器需要引用父容器中的parentClass  
  8.         if(applicationContext.getParent()==null){  
  9.             return;  
  10.         }  
  11.         //Get parent application context  
  12.         this.parentApplicationContext = applicationContext.getParent();  
  13.   
  14.         ConfigurableApplicationContext  childContext = new ClassPathXmlApplicationContext("classpath:/child1.xml");  
  15.         childContext.setParent(this.parentApplicationContext);  
  16.         childContext.refresh();  
  17.         ParentClass parentClass = childContext.getBean(ParentClass.class);  
  18.         Assert.assertNotNull(parentClass);  
  19.     }  
  20.   
  21. }  

3)、child1.xml

 

[html] view plaincopy
 
  1. <bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor">   
  2. <bean id="childClass1" class="com.test1.child.ChildClass1">  

 

4)、ChildClass1

[java] view plaincopy
 
  1. public class ChildClass1 implements InitializingBean {  
  2.   //这里required加上false,是因为是没有建立父子容器关系之前,这个parentClass是注入不了了的  
  3.     @Autowired(required = false)  
  4.     ParentClass parentClass;  
  5.   
  6.   //这里required加上false,是因为子容器之前是不能够相互引用的,只是测试使用。另注:这个类没有放到这里,在子容器2中,这里不贴代码了  
  7.     @Autowired(required = false)  
  8.     ChildClass2 childClass2;  
  9.   
  10.     public void print() {  
  11.         if (parentClass != null) {  
  12.             parentClass.print();  
  13.         }  
  14.         System.out.println("This is child class 1");  
  15.         if (childClass2 != null) {  
  16.             childClass2.print();  
  17.         }  
  18.     }  
  19.   
  20.     public void afterPropertiesSet() throws Exception {  
  21.         print();  
  22.   
  23.     }  
  24. }  
分享到:
评论

相关推荐

    Spring和SpringMVC父子容器关系

    在Spring与SpringMVC的整合应用中,它们之间存在着一种特殊的父子容器关系,这种关系对于理解和优化应用的配置及管理非常重要。 首先,让我们深入理解Spring容器。Spring容器主要分为两种类型:ApplicationContext...

    spring的父子容器及配置详解

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

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

    Spring和SpringMVC父子容器关系初窥 Spring和SpringMVC父子容器关系是一个非常重要的概念,在项目中引入Spring和SpringMVC这两个框架时,它们之间存在着父子容器关系。了解这个关系对解决包扫描问题和配置文件的...

    浅谈Spring与SpringMVC父子容器的关系与初始化

    这样,Spring MVC的ApplicationContext就可以访问到Spring容器中定义的所有Bean,而Spring容器无法直接访问Spring MVC的Bean,这遵循了依赖注入的原则,保证了组件的隔离性。 在实际应用中,Spring容器通常负责处理...

    Spring Web零xml配置原理以及父子容器关系详解

    Spring的IOC(Inversion of Control,控制反转)容器采用父子容器结构,根容器负责全局的Bean定义,如数据源、事务管理器等,而子容器(如由`DispatcherServlet`创建的)则负责处理特定于Web的组件,如控制器、视图...

    基于Maven、Dubbo、Zookeeper、Spring和父子工程之间调用的新手项目搭建

    Spring框架则是Java开发中的一个强大依赖注入容器,它能帮助我们管理对象的生命周期和依赖关系。在Dubbo项目中,我们可以结合Spring来管理服务提供者和服务消费者的bean,实现声明式的服务引用和服务暴露。 具体...

    Spring全家桶知识笔记.pdf

    HierarchicalBeanFactory允许父子级联,这意味着可以创建父子层级关联的容器体系,子容器可以访问父容器中的bean,反之则不行。此外,ConfigurableBeanFactory接口增强了IoC容器的可定制性,允许设置类装载器、属性...

    spring源码合集spring源码合集

    3. **父子容器启动原理**:在"17-SpringMVC源码—父子容器启动原理深入剖析-徐庶"中,我们将揭示Spring MVC如何构建父子容器,并解释容器的启动流程。理解这一过程有助于我们优化应用的初始化性能,合理设计Bean的...

    spring mvc项目

    可用于分析spring mvc源码、spring mvc父子容器初始化流程、session和cookie机制、spring session等,也可以用于学习Java Web(servlet、filter、listener等)、spring源码等。 该项目使用servlet3.0规范,无web.xml...

    Spring学习笔记系列之三

    - **AOP代理**:Spring的AOP代理可以在父子容器中进行配置,使得切面可以在整个应用程序中,包括Web层,进行统一的处理。 - **事务管理**:Spring的声明式事务管理也可以在父容器中配置,这样Web层的事务控制可以...

    SpringPro_springdemo主要是父子模块_源码

    首先,Spring框架本身是由多个模块组成的,如核心容器(Core Container)、数据访问/集成(Data Access/Integration)、Web模块等。在大型项目中,为了更好地管理代码和降低耦合度,开发者通常会将不同功能或服务...

    Spring.html

    Spring IOC 控制反转:把创建对象的权利交给Spring 创建对象 1.... 2.... 3.... ClassPathXmlApplicationContext:使用这个...在Servlet中使用WebApplicationContextUtils获取容器对象 5.使用容器对象去获取Service对象

    Spring.3.x企业应用开发实战(完整版).part2

    第4章 在IoC容器中装配Bean 4.1 Spring配置概述 4.1.1 Spring容器高层视图 4.1.2 基于XML的配置 4.2 Bean基本配置 4.2.1 装配一个Bean 4.2.2 Bean的命名 4.3 依赖注入 4.3.1 属性注入 4.3.2 构造函数注入 4.3.3 工厂...

    Spring MVC 教程,快速入门,深入分析

    此外,Spring MVC的父子上下文可以提供灵活的上下文配置,子容器可以访问父容器的bean,但父容器不能访问子容器的bean。 Spring MVC还提供了对静态资源的访问支持,如jpg、js、css文件的访问。请求映射到具体的...

    关于 SSM 整合.rar

    Spring 和 SpringMVC 是父子容器的关系。Spring 容器是父容器,SpringMVC 是子容器。 子容器可以访问父容器的对象,但是在父容器里不能访问子容器的对象。也就是说在 Controller 里可以访问 Service 对象,但是在 ...

    Spring_3.x企业应用开发实战 目录

    - **父子容器**:支持层次化的容器结构。 - **3.5 Bean的生命周期** - **BeanFactory中Bean的生命周期**:介绍 Bean 在不同容器中的生命周期管理。 - **ApplicationContext中Bean的生命周期**:更详细地讲解 ...

    springcloud处理.docx

    - 文档中提到了一个BeanFactoryPostProcessor,这是一个Spring容器中的特殊类型Bean,可以在所有其他Bean实例化之前运行。在`EurekaServerApplication`中,它被用来移除`tomcatWebServerFactoryCustomizer`的Bean...

    Spring3.x企业应用开发实战(完整版) part1

    第4章 在IoC容器中装配Bean 4.1 Spring配置概述 4.1.1 Spring容器高层视图 4.1.2 基于XML的配置 4.2 Bean基本配置 4.2.1 装配一个Bean 4.2.2 Bean的命名 4.3 依赖注入 4.3.1 属性注入 4.3.2 构造函数注入 4.3.3 工厂...

    ssm项目 初始化资源 ,父子依赖项目

    在Java Web开发中,Spring作为一个全功能的容器,负责管理应用中的对象(bean),提供事务控制、AOP(面向切面编程)等功能。Spring MVC是Spring框架的一部分,专门用于处理Web请求和响应,它提供了模型-视图-控制器...

    spring培训.pptx

    了解spring的加载机制 beanPostProcessor,beanFactoryPostProcessor 的使用 springmvc 的父子容器 aop切面说明 公司内部培训课件

Global site tag (gtag.js) - Google Analytics