一、类图
二、容器的实现接口
Spring容器并不是只有一个。Spring自带多个容器实现,可以归位两种不同的类型。
(1)Bean工厂(由org.springframework.beans.factory.BeanFactory接口定义)是简单的容器实现工厂,提供基本的DI支持。
(2)应用上下文(由org.springframewor.context.ApplicationContext接口定义)基于BeanFactory构建,并提供应用框架级别的服务,例如从属性文件解析文本信息以发布应用事件给感兴趣的事件监听者。
使用这两个对象都可以加载spring配置文件,创建配置文件中对象
区别:
- ApplicationContext 接口继承 BeanFactory 接口,Spring 核心工厂是BeanFactory
- BeanFactory 采取延迟加载,在调用 getBean 方法时才会初始化Bean,
- ApplicationContext 是会在加载配置文件时初始化 Bean。
- ApplicationContext 是对 BeanFactory 扩展,它可以进行国际化处理、事件传递和 bean 自动装配以及各种不同应用层的 Context 实现
三、实现类
Bean工厂和应用上下文都可以选择,但是Bean工厂对大多数应用来说往往太低级了,所以下面主要讨论应用上下文。
Spring自带了多种应用上下文的实现,他们之间的主要区别仅仅在于如何加载配置,下面是几个常用的:
- AnnotationConfigApplicationContext:从一个或多个基于java的配置类中(@Configuration)加载Spring应用上下文
- AnnotationConfigWebApplicationContext:从一个或多个基于Java的配置类加载(@Configuration)spring web应用上下文
- ClassPathXmlApplicationContext:从类路径下(包括jar包)的一个或多个XML配置文件中加载上下文定义,把应用上下文的定义文件作为类资源
- FileSystemApplicationContext:从指定文件系统下的一个或多个xml配置文件中加载上下文定义(绝对路径)
- XmlWebApplicationContext:从web应用下的一个或多个xml配置文件中加载上下文
- EmbeddedWebApplicationContext:springboot加载容器,启动spring容器,new Tomcat嵌入式Tomcat
1. ClassPathXmlApplicationContext和 FileSystemApplicationContext
简单的来说,就是从类路径下或者文件系统下的配置文件加载容器,对bean进行创建和装配。
无论是从文件系统中装载应用上下文还是从类路径下装载应用上下文,将bean加载到bean工厂的过程都是相似的。
例如,你可以使用ClasspathXmlApplicationContext从应用的类路径喜爱加载应用上下文:
ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
类似的,加载一个FileSystemXmlApplicationContext:
ApplicationContext context = new FileSystemXmlApplicationContext("c:/bean.xml");
使用FileSystemXmlApplicationContext和使用ClasspathXmlApplicationContext的区别在于:
前者在指定的文件系统路径下查找bean.xml文件;而后者是在所有的类路径(包含jar文件)下查找bean.xml文件。
2、AnnotationConfigApplicationContext
从java配置中加载应用上下文
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(Bean.class);
//注意,这个Bean.class,是自己定义的java配置类。使用@Configuration注解做的配置类,相当于bean.xml
@Configuration
public Bean {
}
现在我们获得到spring的容器了,那么我们就可以通过上下文对象用getBean()方法从spring容器中获取bean。
以上是IOC容器的大致讨论,不过可以总结为一句话。IOC是替我们创建,管理Bean对象的地方,我们需要的时候可以直接从这里拿。