Spring之ApplicationContext与BeanFactory详解

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从上而下的分析:

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。

ConfigurableApplicationContext接口

public interface ConfigurableApplicationContext extends ApplicationContext, Lifecycle, Closeable

 从ApplicationContext接口额外派生这个接口,而不是直接在ApplicationContext接口声明这些的原因:这些组件都是ApplicationContext接口的实现类在内部自身使用的,而ApplicationContext接口主要是定义对外的功能和方法声明,故在ConfigurableApplicationContext接口中声明这些方法,保证接口的清晰和职责的明确。

AbstractApplicationContext抽象类

public abstract class AbstractApplicationContext extends DefaultResourceLoader
		implements ConfigurableApplicationContext

 ConfigurableApplicationContext接口的抽象实现类
refresh方法:容器启动的骨架实现,使用了模板设计模式。提供对ConfigurableApplicationContext接口的refresh方法的模板实现,即定义了ApplicationContext的启动步骤,但是不提供具体每步的实现,由子类提供。
 

AbstractRefreshableApplicationContext抽象类 

public abstract class AbstractRefreshableApplicationContext extends AbstractApplicationContext

 继承于AbstractApplicationContext抽象类,主要提供可多次重复调用refresh方法,刷新容器,销毁之前的beanFactory和beans,重新创建beanFactory和beans,如在对xml配置文件修改过了之后重新加载。ConfigurableApplicationContext接口的定义,默认是不支持多次调用refresh方法的,多次调用则抛IllegalStateException异常。
 

AbstractRefreshableConfigApplicationContext抽象类 

public abstract class AbstractRefreshableConfigApplicationContext extends AbstractRefreshableApplicationContext
		implements BeanNameAware, InitializingBean
  • 继承于AbstractRefreshableApplicationContext抽象类,定义数组类型的configLocations成员变量,以及set/get方法,用于保存xml配置文件存放的地址。故可以在外部定义多个xml文件来配置需要注册的bean。

AbstractXmlApplicationContext抽象类 

public abstract class AbstractXmlApplicationContext extends AbstractRefreshableConfigApplicationContext

继承于AbstractRefreshableConfigApplicationContext,指定使用xml文件保存配置。
ClassPathXmlApplicationContext:具体实现类,继承于AbstractXmlApplicationContext抽象类,指定从类路径下加载xml配置文件。
FileSystemXmlApplicationContext:具体实现类,继承于AbstractXmlApplicationContext,指定从文件系统加载xml配置文件。

GenericApplicationContext:通用具体实现类 

继承于AbstractApplicationContext抽象类,故不具备上面的Config,Refreshable功能。而Bean的注册,是通过实现BeanDefinitionRegistry接口来提供往内部的beanFactory注入beanDefinitions,而beanDefinitions的来源则是通过BeanDefinitionParser解析,如xml文件来获取的。不支持重复调用refresh。

GenericXmlApplicationContext:继承与GenericApplicationContext,比ClassPathXmlApplicationContext,

FileSystemXmlApplicationContext更加通用的基于xml配置文件的ApplicationContext。即可以在构造函数中指定配置数来源,使用的Resource类型的数组参数。而前两者都是使用String类型的configLocations数组,即路径数组。

AnnotationConfigApplicationContext:注解驱动的实现类

public class AnnotationConfigApplicationContext extends GenericApplicationContext implements AnnotationConfigRegistry 

 这个也是用来处理我们项目中使用的注解的类,即将入@Controller,@Component等注解的类注册成bean。继承于GenericApplicationContext,并实现AnnotationConfigRegistry接口(AnnotationConfigRegistry接口主要实现将给定的beanDefinition注册到绑定的beanFactory中)。

 IOC容器被Web容器感知

ServletContext是web容器,所有的serlet共享一个上下文:

application做为ServletContext的一个属性存放:

所以ServletContext可以访问到所有的注册到IOC容器中的bean。

 

参考资料

https://blog.csdn.net/u010013573/article/details/86597964

https://blog.csdn.net/yangshangwei/article/details/74937778

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值