解析:Spring IoC容器
IoC容器是Spring的核心,也可以称为Spring容器。Spring通过IoC容器来管理对象的实例化和初始化,以及对象从创建到销毁的整个生命周期。
Spring中使用的对象都由IoC容器管理,不需要我们手动使用new运算符创建对象。由IoC容器管理的对象称为SpringBean,SpringBean就是Java对象,和使用new运算符创建的对象没有区别。
Spring通过读取XML或Java注解中的信息来获取哪些对象需要实例化。
Spring提供2种不同类型的IoC容器,即BeanFactory和ApplicationContext容器。
1.BeanFactory容器
BeanFactory是最简单的容器,由org.springframework.beans.factory.BeanFactory接口定义,采用懒加载(lazy-load),所以容器启动比较快。BeanFactory提供了容器最基本的功能。
为了能够兼容Spring集成的第三方框架(如BeanFactoryAware、InitializingBean、DisposableBean),所以目前仍然保留了该接口。
简单来说,BeanFactory就是一个管理Bean的工厂,它主要负责初始化各种Bean,并调用它们的生命周期方法。
BeanFactory接口有多个实现类,最常见的是org.springframework.beans.factory.xml.XmlBeanFactory。使用BeanFactory需要创建XmlBeanFactory类的实例,通过XmlBeanFactory类的构造函数来传递Resource对象。如下所示。
Resource resource = new ClassPathResource("applicationContext.xml"); BeanFactory factory = new XmlBeanFactory(resource); 12复制代码类型:[java]
2.ApplicationContext容器
ApplicationContext继承了BeanFactory接口,由org.springframework.context.ApplicationContext接口定义,对象在启动容器时加载。ApplicationContext在BeanFactory的基础上增加了很多企业级功能,例如AOP、国际化、事件支持等。
ApplicationContext接口有两个常用的实现类,具体如下。
1)ClassPathXmlApplicationContext
该类从类路径ClassPath中寻找指定的XML配置文件,并完成ApplicationContext的实例化工作,具体如下所示。
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(String configLocation);1复制代码类型:[java]
在上述代码中,configLocation参数用于指定Spring配置文件的名称和位置,如Beans.xml。
2)FileSystemXmlApplicationContext
该类从指定的文件系统路径中寻找指定的XML配置文件,并完成ApplicationContext的实例化工作,具体如下所示。
ApplicationContext applicationContext = new FileSystemXmlApplicationContext(String configLocation);1复制代码类型:[java]
它与ClassPathXmlApplicationContext的区别是:在读取Spring的配置文件时,FileSystemXmlApplicationContext不会从类路径中读取配置文件,而是通过参数指定配置文件的位置。即FileSystemXmlApplicationContext可以获取类路径之外的资源,如“F:/workspaces/Beans.xml”。
通常在Java项目中,会采用ClassPathXmlApplicationContext类实例化ApplicationContext容器的方式,而在Web项目中,ApplicationContext容器的实例化工作会交由Web服务器完成。Web服务器实例化ApplicationContext容器通常使用基于ContextLoaderListener实现的方式,它只需要在web.xml中添加如下代码:
<!--指定Spring配置文件的位置,有多个配置文件时,以逗号分隔--> <context-param> <param-name>contextConfigLocation</param-name> <!--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>1234567891011121314复制代码类型:[java]
需要注意的是,BeanFactory和ApplicationContext都是通过XML配置文件加载Bean的。
二者的主要区别在于,如果Bean的某一个属性没有注入,使用BeanFacotry加载后,第一次调用getBean()方法时会抛出异常,而ApplicationContext则会在初始化时自检,这样有利于检查所依赖的属性是否注入。
因此,在实际开发中,通常都选择使用ApplicationContext,只有在系统资源较少时,才考虑使用BeanFactory。本教程中使用的是ApplicationContext容器。