回顾BeanFactory和ApplicationContext的区别

一 概述

Spring框架的主要功能是通过其核心容器来完成的,Spring中的两大核心容器为BeanFactory和ApplicationContext。

二 基础IOC容器之BeanFactory

BeanFactory是org.springframework.beans.factory.BeanFactory接口定义,是基础类型的IOC容器(实现控制反转),他提供了完整的IOC服务支持。简言之,BeanFactory就是一个管理Bean的工厂,它主要负责初始化Bean,并调用它的生命周期方法。

BeanFactory接口提供了几个实现类,其中最常见的是org.springframework.beans.factory.xml.XmlBeanFactory,该类会根据XML配置文件中的定义来装配Bean。

创建BeanFactory实例的时候,需要提供Spring管理容器的详细配置信息,这些信息通常采用XML文件来管理。

BeanFactory beanFactory = new XmlBeanFactory(new FileSystemResource("***/applicationContext.xml"));

但是这种加载方式并不经常使用。

三 Spring核心容器之ApplicationContext

ApplicationContext是BeanFactory的子接口,也被称为应用上下文,是一种常用的Spring核心容器。它是由org.springframework.context.ApplicationContext接口定义,不仅包含了BeanFactory的所有功能,还添加了对国际化,资源访问,事件传播等方面的支持。

创建ApplicationContext接口实例的两种方法:

1. 通过ClassPathXmlApplicationContext创建,它会从类路径classPath中寻找指定的XML配置文件,找到并装载完成ApplicationContext的实例化工作。

Application application = new ClassPathXmlApplicationContext(String configLocation);

其中configLocation参数用于指定Spring配置文件的名称和位置。如果其值为"applicationContext.xml",则Spring会去类路径中查找名称为applicationContext.xml的配置文件。

扫描二维码关注公众号,回复: 12552914 查看本文章

2. 通过FileSystemXmlApplicationContext创建

FileSystemXmlApplication会从指定的文件系统路径(绝对路径)中寻找指定的XML配置文件,找到并装载完成ApplicationContext的实例化工作。

ApplicationContext applicationContext = new FileSystemXmlApplicationContext(String configLocation);

同ClassPathXmlApplicationContext有所不同的是,在读取Spring的配置文件时,FileSystemXmlApplicationContext不再从类路径中读取配置文件,而是通过参数指定配置文件的位置,如“C:/Spring/applicatonContext.xml”。如果在参数中写的不是绝对路径,那么方法调用的时候,就会默认用绝对路径找。这种使用绝对路径的方式使得程序的灵活性变差。

在使用Spring框架的时候,可以通过实例化其中任何一个类来创建ApplicationContext容器。

在Java项目中,通常会通过ClassPathXmlApplicationContext类来实例化ApplicationContext容器的方式。

而在Web项目中,ApplicationContext容器的实例化工作会交由Web服务器完成。Web服务器实例化ApplicationContext容器时,通常会使用基于ContextLoaderListener实现的方式,但是这种方式需要在web.xml文件中增加一些配置信息。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://xmlns.jcp.org/xml/ns/javaee"
	xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
	http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
	id="WebApp_ID" version="3.1">
	<!-- 指定Spring配置文件的位置,多个配置文件时,以逗号隔开 -->	
	<context-param>
		<param-name>contextConfigLocation</param-name>
    <!-- 配置加载Spring文件的监听器,Spring将加载spring目录下的applicationContext.xml文件 -->
		<param-value>classpath:spring/applicationContext.xml</param-value>
	</context-param>
    <!-- 指定以ContextLoaderListener方式启动Spring容器 -->
	<listener>
		<listener-class>
			org.springframework.web.context.ContextLoaderListener
		</listener-class>
	</listener>
</web-app>

在常见Spring容器之后,就可以获取Spring容器中的Bean。Spring获取Bean的实例通常采用以下两种方式:

  • Object GetBean(String name):根据容器中Bean的id或者name来获取指定的Bean,获取之后需要进行强制类型转换。
  • <T> T getBean(Class<T> requiredType):根据类的类型来获取Bean的实例。由于此方法为泛型方法,因此在获取Bean之后不需要进行强制类型转换。

四 BeanFactory和ApplicationContext之间的不同

BeanFactory和ApplicationContext两种容器都是通过XML配置文件加载Bean的。二者的主要区别在于,如果Bean的某个属性没有注入,使用BeanFactory的加载之后,在第一次调用getBean方法时会抛出异常,而ApplicationContext则在初始化时自检,这样有利于检查所有依赖属性是否注入。因此在实际的开发中,通常优先选择使用ApplicationContext,而只在系统资源较少的时候才考虑使用BeanFactory。

猜你喜欢

转载自blog.csdn.net/calm_encode/article/details/113920066