ApplicationContext
BeanFactory和ApplicationContext
Spring通过一个配置文件描述Bean和Bean之间的依赖关系,利用Java反射功能实例化Bean,并建立Bean之间的依赖关系。
Spring的IOC容器在完成这些底层工作的基础上,还提供了Bean实例缓存、生命周期管理、Bean实例代理、时间发布、资源装载等高级服务。
BeanFactory是Spring框架最核心的接口,它提供了高级IOC的配置机制。
ApplicationContext建立在BeanFactory的基础上,提供了更多面向应用的功能, 它提供了国际化支持和框架事件体系。
我们一般称BeanFactory为IoC容器,而称ApplicationContext为应用上下文,但有时候为了行文方便,我们也将ApplicationContext称为Spring容器。
对于BeanFactory 和 ApplicationContext的用途:
BeanFactory是Spring框架的基础设施,面向Spring本身
ApplicationContext面向使用Spring框架的开发者,几乎所有的应用场合都可以直接使用Application而非底层的BeanFactory.
ApplicationContext类体系结构
Application继承了HierachicalBeanFactory和ListableBeanFactory接口,在此基础上,还通过其他接口扩展了BeanFactory的功能。
这些接口如下:
ApplicationEventPublisher:引入事件机制,包括启动事件、关闭事件等,让容器在上下文中提供了对应用事件的支持。
MessageSource:为应用提供i18N国际化消息访问的功能
EnvironmentCapable:实现了此接口的类有应该有一个Environment类型的域,并且可以通过getEnvironment方法取得。 Spring中所有的应用上下文类都实现了此接口。这个接口的主要作用是用于类型检查的。例如框架中有些与用户定义的BeanFactory交互的方法,这些方法有些就需要使用用户定义的BeanFactory的环境变量。这个时候就要看其是否是EnvironmentCapable接口的子类了。 Spring中所有的应用上下文都实现了EnvironmentCapable接口。但是ConfigurableApplicationContext接口重新定义了getEnvironment方法,并将其返回值限定为ConfigurableEnvironment,这样的后果就是,使用ConfigurableApplicationContext接口会覆盖Environment接口。
ResourcePatternResolver:加载资源,可以通过带前缀的Ant风格的资源文件路径装载Spring的配置文件
LifeCycle:该接口提供start()和stop()方法,主要用于控制异步处理的过程,以达到管理和控制JMX、任务调度等目的
public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory, MessageSource, ApplicationEventPublisher, ResourcePatternResolver {
String getId();
String getApplicationName();
String getDisplayName();
long getStartupDate();
ApplicationContext getParent();
AutowireCapableBeanFactory getAutowireCapableBeanFactory() throws IllegalStateException;
}
ConfigurableApplicationContext
ConfigurableApplicationContext扩展于ApplicationContext,主要新增了两个方法 refresh()和close(),让Application具有启动、刷新、关闭应用上下文的能力。
在应用上下文关闭的情况下,refresh可以启动上下文,在启动的情况下可以清楚缓存并重新装载配置信息。 close方法这可以关闭上下文。
BeanFactory设计路径
BeanFactory -> HierarchicalBeanFactory -> ConfigurableBeanFactory,是一个主要的BeanFactory设计路径。
BeanFactory:基本规范,比如说getBean()这样的方法。
HierarchicalBeanFactory:管理双亲IoC容器规范,比如说getParentBeanFactory()这样的方法。
ConfigurableBeanFactory:对BeanFactory的配置功能,比如通过setParentBeanFactory()设置双亲IoC容器,通过addBeanPostProcessor()配置Bean后置处理器。
ApplicationContext设计路径
BeanFactory -> ListableBeanFactory 和 HierarchicalBeanFactory -> ApplicationContext -> ConfigurableApplicationContext,是另外一个主要的ApplicationContext设计路径。
ListableBeanFactory:细化了许多BeanFactory的功能,比如说getBeanDefinitionNames()。
ApplicationContext:通过继承MessageSource、ResourceLoader、ApplicationEventPublisher接口,添加了许多高级特性。
在获取ApplicationContext实例后,我们就可以像BeanFactory那样调用getBean(beanName)返回Bean了。
ApplicationContext的初始化和BeanFactory初始化有一个重大区别:
BeanFactory在初始化容器时,并没有实例化Bean,直到第一次访问某个Bean时才实例化目标Bean。
ApplicationContext会在初始化应用上下文时就实例化所有单实例的Bean。
推荐阅读
-
JSP Spring ApplicationContext的国际化支持
-
SpringBoot实战之ApplicationContext
-
Error starting ApplicationContext.错误解决
-
2021-08-10spring boot启动报错Error starting ApplicationContext(application和前端问题)
-
SpringBoot报错:Error starting ApplicationContext. To display the conditions report...........
-
springboot错误:Error starting ApplicationContext. To display the conditions report re-run your applica
-
为什么大多数IOC容器使用ApplicationContext,而不用BeanFactory
-
Spring学习笔记之Bean基本管理(BeanFactory,ApplicationContext
-
Beans, BeanFactory和ApplicationContext
-
spring+hibernate之applicationContext.xml配置