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.
public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory,
MessageSource, ApplicationEventPublisher, ResourcePatternResolver
ApplicationContext为应用程序提供配置的中央接口。这在应用程序运行时是只读的,但如果实现支持它可能会重新加载。
ApplicationContext 提供:
用于访问应用程序组件的 Bean 工厂方法。继承自 ListableBeanFactory。
以通用方式加载文件资源的能力。继承自 org.springframework.core.io.ResourceLoader 接口。
能够将事件发布到注册的侦听器。继承自 ApplicationEventPublisher 接口。
解析消息的能力,支持国际化。继承自 MessageSource 接口。
从父上下文继承。后代上下文中的定义将始终优先。这意味着,例如,单个父上下文可以被整个 Web 应用程序使用,而每个 servlet 都有自己的子上下文,该子上下文独立于任何其他 servlet 的子上下文。
除了标准的 org.springframework.beans.factory.BeanFactory 生命周期功能之外,ApplicationContext 实现检测和调用 ApplicationContextAware bean 以及 ResourceLoaderAware、ApplicationEventPublisherAware 和 MessageSourceAware bean。
public interface ConfigurableApplicationContext extends ApplicationContext, Lifecycle, Closeable
从ApplicationContext接口额外派生这个接口,而不是直接在ApplicationContext接口声明这些的原因:这些组件都是ApplicationContext接口的实现类在内部自身使用的,而ApplicationContext接口主要是定义对外的功能和方法声明,故在ConfigurableApplicationContext接口中声明这些方法,保证接口的清晰和职责的明确。
public abstract class AbstractApplicationContext extends DefaultResourceLoader
implements ConfigurableApplicationContext
ConfigurableApplicationContext接口的抽象实现类
refresh方法:容器启动的骨架实现,使用了模板设计模式。提供对ConfigurableApplicationContext接口的refresh方法的模板实现,即定义了ApplicationContext的启动步骤,但是不提供具体每步的实现,由子类提供。
public abstract class AbstractRefreshableApplicationContext extends AbstractApplicationContext
继承于AbstractApplicationContext抽象类,主要提供可多次重复调用refresh方法,刷新容器,销毁之前的beanFactory和beans,重新创建beanFactory和beans,如在对xml配置文件修改过了之后重新加载。ConfigurableApplicationContext接口的定义,默认是不支持多次调用refresh方法的,多次调用则抛IllegalStateException异常。
public abstract class AbstractRefreshableConfigApplicationContext extends AbstractRefreshableApplicationContext
implements BeanNameAware, InitializingBean
public abstract class AbstractXmlApplicationContext extends AbstractRefreshableConfigApplicationContext
继承于AbstractRefreshableConfigApplicationContext,指定使用xml文件保存配置。
ClassPathXmlApplicationContext:具体实现类,继承于AbstractXmlApplicationContext抽象类,指定从类路径下加载xml配置文件。
FileSystemXmlApplicationContext:具体实现类,继承于AbstractXmlApplicationContext,指定从文件系统加载xml配置文件。
继承于AbstractApplicationContext抽象类,故不具备上面的Config,Refreshable功能。而Bean的注册,是通过实现BeanDefinitionRegistry接口来提供往内部的beanFactory注入beanDefinitions,而beanDefinitions的来源则是通过BeanDefinitionParser解析,如xml文件来获取的。不支持重复调用refresh。
GenericXmlApplicationContext:继承与GenericApplicationContext,比ClassPathXmlApplicationContext,
FileSystemXmlApplicationContext更加通用的基于xml配置文件的ApplicationContext。即可以在构造函数中指定配置数来源,使用的Resource类型的数组参数。而前两者都是使用String类型的configLocations数组,即路径数组。
public class AnnotationConfigApplicationContext extends GenericApplicationContext implements AnnotationConfigRegistry
这个也是用来处理我们项目中使用的注解的类,即将入@Controller,@Component等注解的类注册成bean。继承于GenericApplicationContext,并实现AnnotationConfigRegistry接口(AnnotationConfigRegistry接口主要实现将给定的beanDefinition注册到绑定的beanFactory中)。
ServletContext是web容器,所有的serlet共享一个上下文:
application做为ServletContext的一个属性存放:
所以ServletContext可以访问到所有的注册到IOC容器中的bean。
https://blog.csdn.net/u010013573/article/details/86597964
https://blog.csdn.net/yangshangwei/article/details/74937778