Spring IOC容器
Spring 容器是 Spring 框架的两大核心之一,是用来管理对象的.容器将创建对象,把它们连接在一起,配置它们,并管理他们的整个生命周期从创建到销毁。
BeanFactory容器
概念
BeanFactory容器是最简单的容器,给DI(依赖注入)提供了基本的支持,由 org.springframework.beans.factory.BeanFactory 接口来定义。BeanFactory或者与之相关的接口(如BeanFactoryAware,InitializingBean,DisposableBean),在Spring中仍然存在具有大量的于Spring整合的第三方框架的反向兼容的目的。
BeanFactory在构建核心容器时,创建对象是采取延迟加载的策略。也就是说,什么时候根据id获取对象,什么时候才真正的创建对象。(多例模式适用)
实例化方式
- 利用框架提供的 XmlBeanFactory() API 去生成工厂 bean 以及利用 ClassPathResource() API 去加载在路径 CLASSPATH 下可用的 bean 配置文件。XmlBeanFactory() API 负责创建并初始化所有的对象,即在配置文件中提到的 bean。
例: XmlBeanFactory factory = new XmlBeanFactory (new ClassPathResource("applicationContext.xml"));
ApplicationContext容器(常用)
概念
ApplicationContext容器是由 org.springframework.context.ApplicationContext 接口定义。该容器添加了更多企业特定的功能,提供了与Spring AOP集成、国际化处理、事件传播及提供不同层次的context实现 (如针对web应用的WebApplicationContext)。
ApplicationContext构建核心容器时,创建对象采取的是立即加载的策略。也就是说,只要一读取完配置文件就创建配置文件中配置的对象。(单例模式适用)
实例化方式
- ClassPathXmlApplicationContext(常用):该容器从 XML 文件中加载已被定义的 bean。在这里,你不需要提供 XML 文件的完整路径,只需正确配置 CLASSPATH 环境变量即可,因为,容器会从 CLASSPATH 中搜索 bean 配置文件。
ClassPathXmlApplicationContext可以加载类路径下的配置文件,要求配置文件必须在类路径下,否则加载不了。
例: ApplicationContext context = new ClassPathXmlApplicationContext( "/applicationContext.xml ");
- FileSystemXmlApplicationContext:该容器从 XML 文件中加载已被定义的 bean。在这里,你需要提供给构造器 XML 文件的完整路径。
FileSystemXmlApplicationContext可以加载磁盘任一路径下的配置文件(需要访问文件的权限)。
例: ApplicationContext context = new FileSystemXmlApplicationContext ("C:/Users/Administrator/Desktop/applicationContext.xml");
- WebXmlApplicationContext:该容器会在一个 web 应用程序的范围内加载在 XML 文件中已被定义的 bean。
例: ServletContext servletContext = request.getSession().getServletContext();
ApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(servletContext);
- AnnotationConfigApplicationContext(常用):使用AnnotationConfigApplicationContext可以实现基于Java的配置类加载Spring的应用上下文。避免使用application.xml进行配置,相比XML配置,更加便捷。
例: AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(UserConfig.class);
IOC容器小结
BeanFactory提供了IOC容器最基本功能,而 ApplicationContext 则增加了更多支持企业级功能支持。
ApplicationContext完全继承BeanFactory,因而BeanFactory所具有的语义也适用于ApplicationContext。
相对于 BeanFactory,ApplicationContext 会更加优秀。
当然,BeanFactory 仍可以在轻量级应用中使用,比如移动设备或者基于applet的应用程序。