博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring IOC启动流程学习(一)
阅读量:6638 次
发布时间:2019-06-25

本文共 4120 字,大约阅读时间需要 13 分钟。

hot3.png

ApplicationContext context = new ClassPathXmlApplicationContext("services.xml", "daos.xml");

 

首先可以看到ClassPathXmlApplicationContext继承于BeanFactory和ResourceLoader两个父类接口。

我们再来看ClassPathXmlApplicationContext的构造方法做了什么

//调用了自己的另一个构造方法public ClassPathXmlApplicationContext(String... configLocations) throws BeansException {   this(configLocations, true, null);}
/**调用了父类的构造方法,同时设置了配置文件的地址,并判断是否刷新**/public ClassPathXmlApplicationContext(String[] configLocations, boolean refresh, ApplicationContext parent)      throws BeansException {   super(parent);   setConfigLocations(configLocations);   if (refresh) {      refresh();   }}

 

跟进源码里面,super(parent),一直调用到了AbstractApplicationContext类

/** * Create a new AbstractApplicationContext with the given parent context. * 第一次传递的parent为null * @param parent the parent context */public AbstractApplicationContext(ApplicationContext parent) {   this();   setParent(parent);}

其中this()方法

/** * Create a new AbstractApplicationContext with no parent. * 获取了一个资源解析器 */public AbstractApplicationContext() {   this.resourcePatternResolver = getResourcePatternResolver();}

所以在初始化的第一步就是设置了一个资源的解析器,让我们再回到第一步的初始化方法

public ClassPathXmlApplicationContext(String[] configLocations, boolean refresh, ApplicationContext parent)      throws BeansException {/** * Create a new AbstractApplicationContext with no parent. * 获取了一个资源解析器 */   super(parent);/** * Create a new AbstractApplicationContext with no parent. * 设置配置文件的地址 */   setConfigLocations(configLocations);/** * Create a new AbstractApplicationContext with no parent. * 重点在这个refresh方法 */   if (refresh) {      refresh();   }}

refresh()方法是实现了ConfigurableApplicationContext接口的refresh方法,

进入refresh()方法内部

@Overridepublic void refresh() throws BeansException, IllegalStateException { 	// 首先加锁,保证同一时间只会执行一个   synchronized (this.startupShutdownMonitor) {      // Prepare this context for refreshing.      prepareRefresh();      // Tell the subclass to refresh the internal bean factory.      // 告诉子类刷新内部bean工厂,如果beanfactory已存在会先销毁所有的bean,然后关闭beanfactory。然后创建beanfactory,加载beanDefinitions(bean定义)      ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();      // Prepare the bean factory for use in this context.      // 准备beanfactory供context使用      prepareBeanFactory(beanFactory);      try {         // Allows post-processing of the bean factory in context subclasses.         // 允许子类在context中的子类执行后置操作         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();         // Initialize other special beans in specific context subclasses.         /// 初始化其他特殊的bean         onRefresh();         // Check for listener beans and register them.         // 注册监听者         registerListeners();         // Instantiate all remaining (non-lazy-init) singletons.         // 初始化所有非lazy的单例bean         finishBeanFactoryInitialization(beanFactory);         // Last step: publish corresponding event.         // 发送事件         finishRefresh();      }      catch (BeansException ex) {         if (logger.isWarnEnabled()) {            logger.warn("Exception encountered during context initialization - " +                  "cancelling refresh attempt: " + ex);         }         // Destroy already created singletons to avoid dangling resources.         destroyBeans();         // Reset 'active' flag.         cancelRefresh(ex);         // Propagate exception to caller.         throw ex;      }      finally {         // Reset common introspection caches in Spring's core, since we         // might not ever need metadata for singleton beans anymore...         resetCommonCaches();      }   }}

refresh()方法没有具体的展开,下次继续学习bean的初始化部分。整个启动的流程可以简单的总结一下为以下流程。

转载于:https://my.oschina.net/u/1175305/blog/3008675

你可能感兴趣的文章
数据分析过程
查看>>
学科前沿技术作业二(下)
查看>>
简述扁平式管理的技术手段
查看>>
jquey实例之animate
查看>>
实施和使用 Singleton 设计模式的有效方式
查看>>
我的友情链接
查看>>
javascript数据类型
查看>>
tar
查看>>
vsftpd服务
查看>>
linux vi或vim文本编辑器基础总结
查看>>
Linux基础命令---mirror获取ftp目录
查看>>
第二部分 OpenStack安装与配置
查看>>
修改SQL数据库中表字段类型时,报“一个或多个对象访问此列”错误的解决方法...
查看>>
FIND的使用方法
查看>>
我的友情链接
查看>>
实现nfs和samba的自动挂载
查看>>
一步一步使用Ext JS MVC与Asp.Net MVC 3开发简单的CMS后台管理系统之创建输出验证码图片的控制器...
查看>>
Js实现找出字符串中出现次数最多的字符
查看>>
我的友情链接
查看>>
飞信批处理应用--每日定时发送天气预报及消息
查看>>