IoC容器是Spring的核心,用于管理对象的实例化和初始化,以及对象从创建到销毁的整个生命周期。
Spring中使用的对象都由IoC容器管理,不需要手动使用new运算符创建对象。由IoC管理的对象称为Spring Bean(本质上就是Java对象)和使用new运算符创建的对象没有区别。
Spring通过读取XML 或 Java注解中的信息来获取哪些对象需要实例化。
Spring提供 2 种不同类型的IoC容器:
BeanFactory ApplicationContext
一、BeanFactory
BeanFactory 是最简单的容器,由 org.springframework.beans.factory.BeanFactory 接口定义,采用懒加载(lazy-load),所以容器启动比较快。BeanFactory 提供了容器最基本的功能,为了能够兼容 Spring 集成的第三方框架(如:BeanFactoryAware、InitializingBean、DisposableBean),目前仍然保留了该接口。
简而言之,BeanFactory 就是一个管理 Bean 的工厂,它主要负责初始化各种 Bean,并调用它们的生命周期方法。
BeanFactory 接口有多个实现类,最常见的是 XmlBeanFactory。
Resource参数来初始 XmlBeanFactory 类:
Resource resource = new ClassPathResource("applicationContext.xml");
BeanFactory factory = new XmlBeanFactory(resource);
二、ApplicationContext
ApplicationContext 继承了 BeanFactory 接口,由 org.springframework.context.ApplicationContext 接口定义,对象在启动容器时加载。ApplicationContext 在 BeanFactory 的基础上增加了很多企业级功能,例如 AOP、国际化、事件支持等。
1、ClassPathXmlApplicationContext
从类路径ClassPath中寻找指定的XML配置文件,并完成ApplicationContext的实例化工作:
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(String configLocation);
2、FileSystemXmlApplicationContext
该类从指定的文件系统路径中寻找指定的XML配置文件:
ApplicationContext applicationContext = new FileSystemXmlApplicationContext(String configLocation);
在一般的Java项目中,会采用ClassPathXmlApplicationContext类实例化ApplicationContext容器的方式;在Web项目中,ApplicationContext容器的实例化工作会交由Web服务器完成,使用基于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>