Spring Ioc创建之BeanFactory创建源码分析
2017-08-15 22:57
666 查看
在上篇博客介绍了Ioc容器创建的大概过程,但BeanFactory创建的具体细节没有说明,好!接下来就让我们来看下BeanFactory创建的具体细节
首先我们来回顾一下前面内容中介绍过的类
接下来进入到方法
对于上面的代码,Emphasis是在方法
类
从上图得知有两个类·
接下来我们就进入到类·AbstractRefreshableApplicationContext,看看方法的具体实现,代码如下:
看上面的代码中,我们看到创建了一个DefaultListableBeanFactory对象beanFactory, 具体过程见下面的代码
两位有一个方法
下面的代码是类AbstractXmlApplicationContext中的该方法
在上面的代码中看到下面所示两个重要操作:
new XmlBeanDefinitionReader(beanFactory)
loadBeanDefinitions(beanDefinitionReader)
综上所述:BeanFactory创建的详细过程看下面的序列图:
首先我们来回顾一下前面内容中介绍过的类
AbstractApplicationContext中的方法
refresh内部出现的一行代码
ConfigurableListableBeanFactory beanFactory = this.obtainFreshBeanFactory();
接下来进入到方法
obtainFreshBeanFactory中去看看具体实现(该方法的实现也是在类
AbstractApplicationContext中)
protected ConfigurableListableBeanFactory obtainFreshBeanFactory() { this.refreshBeanFactory(); ConfigurableListableBeanFactory beanFactory = this.getBeanFactory(); if(this.logger.isDebugEnabled()) { this.logger.debug("Bean factory for " + this.getDisplayName() + ": " + beanFactory); } return beanFactory; }
对于上面的代码,Emphasis是在方法
refreshBeanFactory上,那好!接下来来方法
refreshBeanFactory
protected abstract void refreshBeanFactory() throws BeansException, IllegalStateException;
类
AbstractApplicationContext中的方法
refreshBeanFactory()是个抽象方法,所以需要到继承了AbstractApplicationContext类的子类中才有该方法的具体实现
从上图得知有两个类·
AbstractRefreshableApplicationContext和
GenericApplicationContext实现了抽象方法
refreshBeanFactory()
接下来我们就进入到类·AbstractRefreshableApplicationContext,看看方法的具体实现,代码如下:
protected final void refreshBeanFactory() throws BeansException { //如果存在BeanFactory对象,销毁该对象,并重新创建BeanFactory if(this.hasBeanFactory()) { this.destroyBeans(); this.closeBeanFactory(); } try { DefaultListableBeanFactory beanFactory = this.createBeanFactory(); beanFactory.setSerializationId(this.getId()); this.customizeBeanFactory(beanFactory); //解析和登记Bean对象 this.loadBeanDefinitions(beanFactory); Object var2 = this.beanFactoryMonitor; synchronized(this.beanFactoryMonitor) { this.beanFactory = beanFactory; } } catch (IOException var5) { throw new ApplicationContextException("I/O error parsing bean definition source for " + this.getDisplayName(), var5); } }
看上面的代码中,我们看到创建了一个DefaultListableBeanFactory对象beanFactory, 具体过程见下面的代码
protected DefaultListableBeanFactory createBeanFactory() { return new DefaultListableBeanFactory(this.getInternalParentBeanFactory()); }
两位有一个方法
loadBeanDefinitions(beanFactory)也需要作为重点分析下,在类AbstractRefreshableApplicationContext中该方法是个*抽象方法:
protected abstract void loadBeanDefinitions(DefaultListableBeanFactory var1) throws BeansException, IOException;
下面的代码是类AbstractXmlApplicationContext中的该方法
loadBeanDefinitions(beanFactory)的实现代码
protected void loadBeanDefinitions(DefaultListableBeanFactory beanFactory) throws BeansException, IOException { XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(beanFactory); beanDefinitionReader.setEnvironment(this.getEnvironment()); beanDefinitionReader.setResourceLoader(this); beanDefinitionReader.setEntityResolver(new ResourceEntityResolver(this)); this.initBeanDefinitionReader(beanDefinitionReader); this.loadBeanDefinitions(beanDefinitionReader); }
在上面的代码中看到下面所示两个重要操作:
new XmlBeanDefinitionReader(beanFactory)
loadBeanDefinitions(beanDefinitionReader)
综上所述:BeanFactory创建的详细过程看下面的序列图:
相关文章推荐
- Spring IOC 容器源码分析 - 创建原始 bean 对象
- 2、Spring的LocalSessionFactoryBean创建过程源码分析
- Spring IOC 容器源码分析 - 创建单例 bean 的过程
- 先码后看 spring IOC源码(beanfactory、applicationcontext、webapplicationcontext) 侵立删
- Spring的IOC逐层深入——源码解析之IoC的根本BeanFactory(五)
- 做一个合格的程序猿之浅析Spring IoC源码(二)BeanFactory初始化
- 创建ApplicationContext与BeanFactory时的区别-Spring源码学习之容器的基本实现
- 做一个合格的程序猿之浅析Spring AOP源码(十四) 分析ProxyFactoryBean
- Spring源码分析-2-创建Bean
- spring 核心与源码解析(1):IoC之BeanFactory
- 创建ApplicationContext与BeanFactory时的区别-Spring源码学习之容器的基本实现
- 【Spring源码分析】原型Bean实例化过程、byName与byType及FactoryBean获取Bean源码实现
- Spring Ioc创建源码分析
- spring 源码分析--第二章 AbstractBeanFactory
- Spring 源码分析《Bean的获取与创建流程》
- Spring IOC容器bean初始化源码分析
- Spring源码分析——BeanFactory体系之接口详细分析
- 做一个合格的程序猿之浅析Spring IoC源码(六)BeanFactoryPostProcessor
- Spring源码系列:BeanFactory的创建
- 浅析Spring IoC源码(七)浅谈BeanFactory和FactoryBean