ApplicationContext接口


在使用Spring的时候,我们经常需要先得到一个ApplicationContext对象,然后从该对象中获取我们配置的Bean对象。ApplicationContext隶属于org.springframework.context,是SpringFramework中Bean的管理者,为SpringFramework的诸多功能提供支撑作用。

下图是Spring-4.3.3.RELEASE版本中ApplicationContext相关的UML类视图(浅绿色的为接口,浅黄色的为类):

BeanFactory系列接口:

public interface BeanFactory

BeanFactory 是 Spring 管理 Bean 的最顶层接口,是一个 Bean 容器, 管理一系列的 bean,每一个 bean 使用一个String 类型的 name(或称之为id) 来唯一确定,这些 Bean 可以是 prototype 的或者 singleton的 。Spring 提倡使用依赖注入(Dependency Injection) 的方式装配 Bean。BeanFactory从“configuration source”加载Bean的定义,configuration source 可以是xml文件或者properties文件甚至是数据库。

public interface HierarchicalBeanFactory extends BeanFactory

BeanFactory的子接口HierarchicalBeanFactory是一个具有层级关系的Bean 工厂,拥有属性parentBeanFactory。当获取 Bean对象时,如果当前BeanFactory中不存在对应的bean,则会访问其直接 parentBeanFactory 以尝试获取bean 对象。此外,还可以在当前的 BeanFactory 中 override 父级BeanFactory的同名bean。

public interface ListableBeanFactory extends BeanFactory

ListableBeanFactory 继承了BeanFactory,实现了枚举方法可以列举出当前BeanFactory中所有的bean对象而不必根据name一个一个的获取。 如果 ListableBeanFactory 对象还是一个HierarchicalBeanFactory则getBeanDefinitionNames()方法只会返回当前BeanFactory中的Bean对象而不会去父级BeanFactory中查询。

 

ApplicationContext接口的功能说明:

public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory, MessageSource, ApplicationEventPublisher, ResourcePatternResolver


ApplicationContext接口继承众多接口,集众多接口功能与一身,为Spring的运行提供基本的功能支撑。根据程序设计的“单一职责原则”,其实每个较顶层接口都是“单一职责的”,只提供某一方面的功能,而ApplicationContext接口继承了众多接口,相当于拥有了众多接口的功能,下面看看它的主要功能:

  • 首先,它是个BeanFactory,可以管理、装配bean,可以有父级BeanFactory实现Bean的层级管理(具体到这里来说它可以有父级的ApplicationContext,因为ApplicationContext本身就是一个BeanFactory。这在web项目中很有用,可以使每个Servlet具有其独立的context, 所有Servlet共享一个父级的context),它还是Listable的,可以枚举出所管理的bean对象。
  • 其次,它是一个ResourceLoader,可以加载资源文件;
  • 再次,它可以管理一些Message实现国际化等功能;
  • 还有,它可以发布事件给注册的Listener,实现监听机制。

 

ApplicationContext两个比较常用的实现类:

  • ClassPathXmlApplicationContext: 使用类路径方式初始化ioc容器(推荐使用)
  • FileSystemApplicationContext:  使用文件系统的方式初始化ioc容器

1) 演示ClassPathXmlApplicationContext:

/**
 * @author http://www.yiidian.com
 *
 */
public class Demo2 {
	
	@Test
	public void test1(){
		/**
		 * 方式一:类路径方式加载,默认在类路径的根目录下(也就是src目录下)
		 */
		ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
		CustomerDao customerDao = (CustomerDao)ac.getBean("customerDao"); 
		System.out.println(customerDao);
	}
}

2)演示FileSystemApplicationContext: 

绝对路径:

@Test
	public void test2(){
		/**
		 * 方式二:使用文件系统的方式初始化ioc容器
		 */
		//2.1 绝对路径
		ApplicationContext ac = new FileSystemXmlApplicationContext("E:\\workspaces\\yiidian_spring\\02.spring-ioc-helloworld\\src\\applicationContext.xml");
		CustomerDao customerDao = (CustomerDao)ac.getBean("customerDao"); 
		System.out.println(customerDao);
	}

相对路径:

@Test
	public void test3(){
		/**
		 * 方式二:使用文件系统的方式初始化ioc容器
		 */
		//2.2 相对路径
		ApplicationContext ac = new FileSystemXmlApplicationContext("./src/applicationContext.xml");
		CustomerDao customerDao = (CustomerDao)ac.getBean("customerDao"); 
		System.out.println(customerDao);
	}

 

源码下载:http://pan.baidu.com/s/1hrA2sV6