Spring中父子容器的实现实例

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

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

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

1)、Runner.java

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

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

public class ParentClass{
	public void print(){
		System.out.println("This is parent class.");
	}
}

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

public class PluginLoader implements ApplicationContextAware {
	ApplicationContext parentApplicationContext;
	ConfigurableApplicationContext childContext;

	public void load() {
	  //扫描所有classpath下面的以plugin_开头spring的配置文件进行装配,这里约定所有的子容器插件都必须有一个以plugin_开头的配置文件,并通过这个文件被父容器加载
		childContext = new ClassPathXmlApplicationContext("classpath*:/plugin_*.xml");
		childContext.setParent(parentApplicationContext);
		childContext.refresh();
	}

	public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
		this.parentApplicationContext = applicationContext;
	}
}

4)、spring1.xml

<bean id="parentClass" class="com.test1.ParentClass"></bean>
<bean id="pluginLoader" class="com.test1.PluginLoader" init-method="load"></bean>

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

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

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

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

<pre name="code" class="html"><bean id="childContext1" class="com.test1.child.ChildContext1"></bean>

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

public class ChildContext1 implements ApplicationContextAware {

	ApplicationContext parentApplicationContext;

	public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
	  //父容器中没有建立父子容器关系之前,是获取不到parent的,只有父容器执行refresh方法后,第二次初使化子容器才会获取得到
	  //也就是第一次的初使化就不执行了,等父容器中建立好父子容器关系后再进行初使化,因为子容器需要引用父容器中的parentClass
		if(applicationContext.getParent()==null){
			return;
		}
		//Get parent application context
		this.parentApplicationContext = applicationContext.getParent();

		ConfigurableApplicationContext  childContext = new ClassPathXmlApplicationContext("classpath:/child1.xml");
		childContext.setParent(this.parentApplicationContext);
		childContext.refresh();
		ParentClass parentClass = childContext.getBean(ParentClass.class);
		Assert.assertNotNull(parentClass);
	}

}

3)、child1.xml

	<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor">
	<bean id="childClass1" class="com.test1.child.ChildClass1">

4)、ChildClass1

public class ChildClass1 implements InitializingBean {
  //这里required加上false,是因为是没有建立父子容器关系之前,这个parentClass是注入不了了的
	@Autowired(required = false)
	ParentClass parentClass;

  //这里required加上false,是因为子容器之前是不能够相互引用的,只是测试使用。另注:这个类没有放到这里,在子容器2中,这里不贴代码了
	@Autowired(required = false)
	ChildClass2 childClass2;

	public void print() {
		if (parentClass != null) {
			parentClass.print();
		}
		System.out.println("This is child class 1");
		if (childClass2 != null) {
			childClass2.print();
		}
	}

	public void afterPropertiesSet() throws Exception {
		print();

	}
}

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

原文地址:https://www.cnblogs.com/skiwdhwhssh/p/10342011.html

时间: 2024-12-09 17:24:40

Spring中父子容器的实现实例的相关文章

spring的父子容器

在创建ssm项目工程时,经常需要读取properties资源配置文件,传统的方法当然可以. 但是spring提供了更简便的方法,@value注解. 在page.properties文件中,配置分页信息. 这个时候,发现在Service层用@value("${PAGESIZE}")可以取到10. 然而在controller中同样的注解却不起作用了. 原来,这涉及到了spring的父子容器问题. spring和springmvc都是容器.spring是父容器,springmvc是子容器.

深入了解Spring中的容器

1.创建Bean的3种方式 1.1使用构造器创建bean实例 这是最常见的方式,如果不采用构造注入,bean类需要有默认构造函数.如果采用构造注入,则需要配置xml文件的<constructor-arg> 1.2使用静态工厂方法创建bean 最典型的工厂方法如 1 package spi; 2 3 public class PersonFactory { 4 public static Person getPerson(String arg) { 5 if (arg.equalsIgnoreC

Spring中@Transactional事务回滚实例及源码

一.使用场景举例 在了解@Transactional怎么用之前我们必须要先知道@Transactional有什么用.下面举个栗子:比如一个部门里面有很多成员,这两者分别保存在部门表和成员表里面,在删除某个部门的时候,假设我们默认删除对应的成员.但是在执行的时候可能会出现这种情况,我们先删除部门,再删除成员,但是部门删除成功了,删除成员的时候出异常了.这时候我们希望如果成员删除失败了,之前删除的部门也取消删除.这种场景就可以使用@Transactional事物回滚. 二.checked异常和unc

Spring 中 IoC 容器简介

IoC 是一种通过描述来生成或者获取对象的技术,可以说 Spring 是一种基于 IoC 容器编程的框架 在一个系统中可以生成各种对象,并且这些对象都需要进行管理.为了描述这些对象关系,我们需要一个容器.在 Spring 中把每一个需要管理的对象称为 Spring Bean ,而管理这些 Bean 的容器就被称为 Spring IoC 容器. IoC 容器需要具备两个基本的功能: 通过描述管理 Bean ,包括发布和获取 Bean 通过描述完成 Bean 之间的依赖关系 介绍 Spring Io

半夜思考之查漏补缺, Spring 中的容器后处理器

之前学 Spring 的时候 , 还没听过容器后处理器 , 但是一旦写出来 , 就会觉得似曾相识 . 容器配置器通常用于对 Spring 容器进行处理 , 并且总是在容器实例化任何其他 Bean 之前 , 读取配置文件中的元数据 , 并有可能修改这些数据 . Spring 提供了如下几个常用的容器后处理器 : PropertyPlaceholderConfigurer : 属性占位符配置器 PropertyOverrideConfigurer : 重写占位符配置器 CustomAutowireC

Spring中Ioc容器的注入方式

1 通过setter方法注入 bean类: package com.test; public class UserServiceImplement implements IUserService { private IUserDao user; public IUserDao getUser() { return user; } public void setUser(IUserDao user) { this.user = user; } public void saveUser() { us

Spring中IOC容器对数组,集合的相关bean的装配

<bean id="department" class="com.pojo.Department"> <property name="name" value="人事部"></property> <!-- 数组 --> <property name="empName"> <list> <value>张三</value&g

Spring 父子容器

必须要说的是,父子容器是通过设置形成的关系. 容器实现了ConfigurableApplicationContext或ConfigurableBeanFactory接口,这两个接口中分别有setParent及setParentBeanFactory方法,可以将指定容器设置为当前容器的父容器. 首先,默认情况下,Spring + SpringMVC 框架的web项目,会先创建WebApplicationContext(应用上下文环境,就是IoC容器啦),并以WebApplicationContex

spring父子容器

通过HierarchicalBeanFactory接口,Spring的IoC容器可以建立父子层级关联的容器体系,子容器可以访问父容器中的Bean,但父容器不能访问子容器的Bean.在容器内,Bean的id必须是唯一的,但子容器可以拥有一个和父容器id相同的Bean.父子容器层级体系增强了Spring容器架构的扩展性和灵活性,因为第三方可以通过编程的方式,为一个已经存在的容器添加一个或多个特殊用途的子容器,以提供一些额外的功能. Spring使用父子容器实现了很多功能,比如在Spring MVC中