再次阅读这本书有些不一样的感悟,记录一些零星点点。

1.1 关于IOC容器设计的线路区别

我们都知道在Spring里主要有两种设计IOC容器的思路,一种是围绕BeanFactory,另外一种是围绕ApplicationContext展开。这两种设计的主要区别在哪里?

从头回忆一下两种设计方案的实现

1.1.1 BeanFactory

以下是BeanFactory接口:



处于IOC顶层的设计接口BeanFactory只提供了一些基本的方法,getBean(),containsBean(),isSingleton()等等。

我们以XmlBeanFactory为例子展示创建它的过程:

首先是一张UML图:

构造函数

public XmlBeanFactory(Resource resource, BeanFactory parentBeanFactory) throws BeansException {
super(parentBeanFactory);
this.reader = new XmlBeanDefinitionReader(this);
this.reader.loadBeanDefinitions(resource);
}

可以看出创建以BeanFactory为设计路线的IOC容器的时候主要有四步:

  • 创建Rerouce资源类,定位到xml。
  • 创建BeanFactory类。
  • 创建Reader类并回调配置给我们创建的BeanFactory类。
  • 用这个Reader类去加载我们的BeanDefinition

1.1.2 ApplicationContext



可以从类结构图里看到Application不仅继承了我们传统的BeanFactory设计线路,还继承了其他接口,这样使得ApplicationIOC容器的功能更加强大。有以下特点:

  • 支持不同的信息源
  • 访问资源,这一特性体现在我们的Resouce和ResourceReader上,这样我们可以从不同的地方得到BeanDefinition
  • 支持应用事件。这些事件和Bean生命周期的结合为管理Bean提供了便利。

关于Bean的载入和依赖注入其实两个不同的过程,Bean的载入一般分为三个过程:1.BeanDefinition的定位2.Bean信息的载入(将具体POJO对象抽象为Bean内部数据结构的过程)3.Bean信息的注册(IOC内部会维护一个hashmap去存储这些Bean信息)。而我们的依赖注入也就是我们所谓的DI,这里注意关于IOC和DI你可以将IOC理解成一种设计手段,而DI就是实现这种手段的一种方式 。我们的DI一般发生在我们应用首次调用该Bean的时候。当然有一种例外在Bean初始化的时候就发生依赖注入就是我们的懒加载机制。

这里结束就可以回答开头的问题,这两种设计路线的区别,从类结构图可以看到ApplicationContext已经继承了Reader类为我们提供了一系列加载不同Resource的读取器的实现。因此我们编程式中就不必为该类IOC容器声明Reader再进行回调配置了。

2.1 FileSystemXmlApplicationContext

那么ApplicationContext类IOC容器在何时配置的读取器,我们以FileSystemXmlApplicationContext为例:



关于这个读取器的配置我们可以在它的基类AbstractRefreshableApplicationContext中找到,我们都知道refresh的调用是在FileSystemXmlApplicationContext的构造函数中,这是IOC容器初始化的入口。在AbstractRefreshableApplicationContext中有一个抽象方法loadBeanDefinitions(DefaultListableBeanFactory var1),这个抽象方法在 AbstractXmlApplicationContext中有被实现其中就配置了Reader读取器。

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);
}

最新文章

  1. windows下安装easy_install, pip 及whl文件安装方法
  2. juqery 拖拽元素
  3. 支付宝WAP支付接口开发(Node/Coffee语言)
  4. WinForm 问题集锦
  5. Linux下文件重命名、创建、删除、修改及保存文件
  6. C primer plus 练习题 第五章
  7. hdoj 1083 Courses【匈牙利算法】
  8. Codeforces 437B The Child and Set
  9. android中获取时间
  10. poj 1456 Supermarket(并查集维护区间)
  11. 通过virtualbox最小化安装centos 6.3后无法上网解决办法
  12. VN问题:error:请求的名称有效,但是找不到请求的类型的
  13. Mix 导航
  14. Oracle11g 配置DG broker
  15. D 矩阵快速幂
  16. hdu 3829 Cat VS Dog 二分图匹配 最大点独立集
  17. UNITY3d在移动设备上的一些优化实战
  18. wpf 水波进度条 用户控件
  19. Hadoop守护进程【简--】
  20. vue.js个人学习心得

热门文章

  1. linux 常用命令(一)——查看硬盘空间-内存-线程的cpu负载-线程内存
  2. Oracle数据库 —— DDL
  3. 去除所有js,html,css代码
  4. C#多线程开发-线程同步 02
  5. .Net Core 中的选项Options
  6. 第二课:启动 GDB 调试
  7. C语言实现有限状态机
  8. ABP 极简入门教程(三 权限)
  9. Mybatis公司开发常用!
  10. mysql触发器实时检测一条语句进行备份删除