Spring Framework--ApplicationComtext(1)简介
前言
哈哈?是不是很久没写博文了?总是各种原因(liyou)导致不写博文。废话不多说,骚年还是学习吧。
1 概述
Spring这个东西可真大啊,总共将近20个组件,但是知乎大神们告诉我,其中比较核心的组件只有core,context和beans。aop,web等都属于核心上层的特性功能。为了适应时代的变化,社会的发展,最近打算就先从context入手,而这里面,我们又不得不提ApplicationContext。
注:以发文日期最新版github上spring源码为基础进行阅读,版本号,后期加上。
git地址:
https://github.com/spring-projects/spring-framework.git
1.1 IOC(控制反转)
实际应用的程序基本上都是由多个类彼此合作来实现业务逻辑,这使得每个对象都需要与其合作的对象的引用。但是这样的控制就导致了程序的耦合度非常大,不易于复用,更不易于做单元测试。
Martin Flowler 提出了“那些方面的控制被反转了?”这个问题。他得出的结论是:依赖对象的获得被反转了。基于这个结论,他为控制反转创造了一个更好的名字:依赖注入。
依赖倒置原则:
- 高层次的模块不应该依赖于低层次的模块,他们都应该依赖于抽象。
- 抽象不应该依赖于具体实现,具体实现应该依赖于抽象。
依赖倒置也是设计模式六大原则之一。在Spring中IoC容器就是这个模式的载体,它可以通过容器对对象进行管理,在对象生成或初始化时直接将数据注入到需要其依赖的对象中。
1.2 ApplicationContext
Spring中容器要分两类,一类是实现BeanFactory接口的简单容器系列,这类容器只实现了容器的最基本功能(这个还不太了解);另一个是ApplicationContext应用上下文,也就是我们最常用的,项目中的配置文件大多数都是ApplicationContext-xxx.xml,它作为容器的高级形态而存在。本文将对ApplicationContext进行阅读讲解。
首先看看ApplicationContext的简略版类图:
再看看包含方法的接口方法的ApplicationContext类图:
从上图ApplicationContext接口的继承关系可以看出,它除了容器所需的基本特性外,还有其他许多附加特性,比如国际化的消息访问、资源访问、事件传播、载入多个上下文等。
在这个接口体系中,ListableBeanFactory和HierarchicalBeanFactory两个接口,连接BeanFactory接口定义和ApplicationConext应用上下文的接口定义。在ListableBeanFactory接口中,细化了许多BeanFactory的接口功能,比如定义了getBeanDefinitionNames()接口方法;对于HierarchicalBeanFactory接口,增加了getParentBeanFactory()的功能,是BeanFactory具备了双亲IoC容器的管理功能,在ConfigurableBeanFactory中主要定义了一些对BeanFactory的配置功能,比如通过setParentBeanFactory()设置双亲IoC容器,通过addBeanPostProcessor()定义了Bean后置处理器等。;对于ApplicationContext接口,它通过继承MessageSource、ResourceLoader、ApplicationEventPublisher接口,在BeanFactory简单IoC容器的基础上添加了许多对高级容器的特性的支持。总体来说 ApplicationContext 必须要完成以下几件事:
- 标识一个应用环境
- 利用BeanFactory 创建Bean 对象
- 保存对象关系表
- 能够捕获各种事件
下篇博客,将从ClassPathXmlApplicationContext线入手,对上面要做的几件事,进行详细解释。