Spring之ApplicationContext简述

ApplicationContext 由 BeanFactory 派生而来, 提供了更多面向实际应用的功能.

ApplicationContext 的主要实现类是 ClassPathXmlApplicationContext 和 FileSystemApplicationContext, 前者默认从类路径加载配置文件, 后者默认从文件系统中装载配置文件. ApplicationContext继承了 ListableBeanFactory 和 HierarchicalBeanFactory 接口. 还通过多个其他的接口扩展了 BeanFactory 的功能.

这些接口如下:

ApplicationEventPublisher:  让容器拥有发布应用上下文事件的功能, 包括容器启动事件,  关闭事件等. 实现了 ApplicationListerer事件监听接口的Bean 可以接收到容器事件, 并对事件进行响应处理. 

MessageSource: 为应用提供 il8n 国际化消息访问的功能.

ResourcePatternResolver: 所有ApplicationContext实现类都实现了类似于 PathMatchingResourcePatternResolver 的功能.  可以通过资源文件路径装载配置文件.

LifeCycle:  该接口提供了 start()和stop() 两个方法, 主要用于异步处理过程. 在具体使用时, 该接口同时被 ApplicationContext实现及具体Bean实现, ApplicationContext会将 start/stop 的信息传递给容器中所有实现了该接口的Bean. 以达到管理和控制JMX, 任务调度等目的.

一. ApplicationContext类体系结构

1.ConfigurableApplicationContext: 扩展于 ApplicationContext , 新增了两个主要方法: refresh() 和 close(); 让 ApplicationContext具有启动, 刷新和关闭应用上下文的能力. 在应用上下文关闭的情况下调用 refresh() 即可启动应用上下文, 在已经启动的状态下 调用 refresh()则可清除缓存并重新装配配置信息. 调用 close()则可关闭应用上下文. 

FileSystemXmlApplicationContext 和 ClassPathXmlApplicationContext 都可以显示使用带资源类型前缀的路径. 如果不显示指定资源类型前缀, 则分别将路径解析为 文件系统路径(file:) 和 类路径 (classpath:)

ApplicationContext 的初始化和 BeanFactory 有一个重大区别 : BeanFactory 在初始化容器时, 并未实例化 Bean. 直到第一次访问某个 Bean时才实例化目标 Bean.  而ApplicationContext 在初始化应用上下文时就实例化所有单实例Bean.

二.ApplicationContext中 Bean的生命周期.

ApplicationContext 和 BeanFactory 的另一个区别在于: 前者会利用Java反射机制自动识别出配置文件中定义的 BeanPostProcessor, InstantationAwareBeanPostProcessor 和 BeanFactoryPostProcessor. 并自动将它们注册到应用上下文中. 而 BeanFactory 需要在代码中调用 addBeanPostProcessor()方法进行注册.  在ApplicationContext中, 只需在配置文件中通过<bean>定义工厂后处理器和Bean后处理器就可以按照预期方式运行.

ApplicationContext中Bean的生命周期图解

Bean 在应用上下文中的周期与BeanFactory中类似, 不同的是, 如果Bean实现了 ApplicationContextAware接口, 则会调用接口的setApplicationContext()方法.  

如果在配置文件中声明了工厂后处理器 BeanFactoryPostProcessor的实现类, 则在应用上下文装载配置文件之后, 初始化Bean实例之前将调用这些 BeanFactoryPostProcessor对配置信息进行加工处理. 工厂处理器是容器级的, 仅在应用上下文初始化时调用一次, 目的是为了完成一些配置文件的加工处理工作.

三.注册工厂后处理器BeanFactoryPostProcessor

MBeanFactoryPostProcessor实现了BeanFactoryPostProcessor接口为工厂后处理器, 它修改了Car Bean的属性type的值.

通过MBeanFactoryPostProcessorTest对工厂后处理器进行测试, 发现工厂后处理器更改了配置文件中为type属性设置的值.

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值