spring源码阅读(五)之ApplicationContext
来源:互联网 发布:免费听课的软件 编辑:程序博客网 时间:2024/05/21 20:50
上一篇介绍了基本的IOC容器BeanFactory以及常用的继承类XmlBeanFactory,但那时基本的一个容器,Spring扩展一个程序员常用的的一个容器ApplicationContext
它是AbstractXmlApplicationContext的子类。他有2个主要的功能,一个是
public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory,MessageSource, ApplicationEventPublisher, ResourcePatternResolver {
是一个高级的IOC容器。
扩展MessageSource,支持国际化
扩展ApplicationEventPublisher提供bean的生命周期管理
类似于上一篇介绍BeanFactory的子类XmlBeanFactory一样,这一篇介绍FileSystemXmlApplicationContext
public class FileSystemXmlApplicationContext extends AbstractXmlApplicationContext
它是AbstractXmlApplicationContext的子类。他有2个主要的功能,一个是
public FileSystemXmlApplicationContext(String[] configLocations, boolean refresh, ApplicationContext parent)throws BeansException {super(parent);setConfigLocations(configLocations);if (refresh) {refresh();}}刷新IOC容器。这个AbstractApplicationContext类里面的refresh()方法异常的复杂。
public void refresh() throws BeansException, IllegalStateException {synchronized (this.startupShutdownMonitor) {<span style="color: rgb(0, 130, 0); font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', Consolas, 'Courier New', monospace; line-height: 18px; background-color: rgb(250, 250, 250);">//准备启动spring容器,设置容器的启动日期和活动标志</span>prepareRefresh();<span class="comment" style="color: rgb(0, 130, 0); padding: 0px; margin: 0px; width: auto; border: 0px; font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', Consolas, 'Courier New', monospace; line-height: 18px; background-color: rgb(250, 250, 250);">//获得容器ApplicationContext的子类BeanFactory。步骤如下:如果已经有了BeanFactory就销毁它里面的单例Bean并关闭这个BeanFactory。2.创建一个新的BeanFactory。3.对这个BeanFactory进行定制(customize),如allowBeanDefinitionOverriding,allowCircularReferences。4.转载BeanDefinitions(读取配置文件,将xml转换成对应得BeanDefinition)。5.检查是否同时启动了两个BeanFactory。</span><span style="font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', Consolas, 'Courier New', monospace; line-height: 18px; background-color: rgb(250, 250, 250);"> </span>ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();prepareBeanFactory(beanFactory);<pre name="code" class="html"><span class="comment" style="color: rgb(0, 130, 0); padding: 0px; margin: 0px; width: auto; border: 0px; font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', Consolas, 'Courier New', monospace; line-height: 18px; background-color: rgb(250, 250, 250);">//配置BeanFactory(就是将ApplicationContext的一些属性配置到BeanFactory上吧)。这里做了很多事情,可以看看其源码,比较重要的如设置classLoader;将BeanPostProcess注册到BeanFactory里。</span><span style="font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', Consolas, 'Courier New', monospace; line-height: 18px; background-color: rgb(250, 250, 250);"> </span>try {// Allows post-processing of the bean factory in context subclasses.postProcessBeanFactory(beanFactory);// Invoke factory processors registered as beans in the context.invokeBeanFactoryPostProcessors(beanFactory);// Register bean processors that intercept bean creation.registerBeanPostProcessors(beanFactory);// Initialize message source for this context.initMessageSource();// Initialize event multicaster for this context.initApplicationEventMulticaster();/初始化单例的Bean,并将其保存起来。 onRefresh();// Check for listener beans and register them.registerListeners();// Instantiate all remaining (non-lazy-init) singletons.finishBeanFactoryInitialization(beanFactory);// Last step: publish corresponding event.finishRefresh();}catch (BeansException ex) {// Destroy already created singletons to avoid dangling resources.destroyBeans();// Reset 'active' flag.cancelRefresh(ex);// Propagate exception to caller.throw ex;}}}这个方法先mark一下,以后再慢慢解析,因为还有一些东西没看懂。
另外一个功能是和XmlBeanFactory通过xml加载资源
@Overrideprotected Resource getResourceByPath(String path) {if (path != null && path.startsWith("/")) {path = path.substring(1);}return new FileSystemResource(path);}
0 0
- spring源码阅读(五)之ApplicationContext
- Spring源码之ApplicationContext(五)激活BeanFactory
- Spring源码之ApplicationContext(一)
- spring 核心与源码解析(2):IoC之ApplicationContext
- Spring源码阅读(四)—容器的功能拓展ApplicationContext
- Spring源码阅读-ApplicationContext对BeanFactory的增强
- Spring源码之ApplicationContext(二)准备工作
- Spring源码之ApplicationContext(三)加载BeanFactory
- Spring源码之ApplicationContext(四)功能补充
- Spring源码之ApplicationContext(六)注册BeanPostProcessor
- Spring源码之ApplicationContext(八)消息广播
- Spring源码之ApplicationContext(十)过程刷新
- spring源码阅读(四)之BeanFactory
- Spring源码阅读(五)—AOP基础
- Spring源码学习--ApplicationContext(十二)
- spring源码-4-applicationContext(环境上下文)
- Spring 源码分析:ApplicationContext
- Spring 源码分析:ApplicationContext- -
- 自动连接VPN
- 字符串处理
- S3C2440 Linux驱动移植——LED heartbeat
- MFC遍历某个文件夹,并用tree Control简单显示
- Labview使用UDP通信的问题
- spring源码阅读(五)之ApplicationContext
- Android系统权限和root权限
- 客户端程序开发中的mvc设计模式
- 【Leetcode】Permutations (Backtracking)
- 终于摆脱千里之外~~~~~
- Appium_Selendroid安装native应用
- 7st
- [Live]不忘初心,方得始终
- 收藏网址