本文 spring复习笔记
概述
最常用的是Spring FrameWork(核心),IoC的容器,同时提供模块AOP、MVC、JDBC、事务处理等。其它海域Spring Web Flow,Spring BlazeDS,Spring Security等。
IoC核心结构
假如代码中引用的对象使用创建构造等,那么引用代码和被引用的代码有着强耦合,IoC通过将对象创建的过程交个框架(也就是对象的注入),从而实现了解耦,并且根据依赖关系有序的创建对象,反转就是将代码的控制权交给了平台或者框架。
简单的说,以前是new实现类,而现在是通过容器的XML或者注解标记,让容器去创建对象。
IoC的核心就是BeanFactory和ApplicationContext,其中BeanFactory接口是简单容器(功能十分强大的工厂类),ApplicationContext应用上下文(提供框架性质功能)是容器的高级形态,除了基本容器功能(造对象)之外主要就是有了事件通知机制。

具体的Ioc容器都是在这个接口体系下实现的,比如DefaultListableBeanFactory就是实现了ConfigurableBeanFactory。
XMLBeanFactory是在DefaultListableBeanFactory的基础上做扩展,而ApplicationContext的实现也是如此。
按照组件思路划分是三个部分:Beans组件、Core组件和Context组件。这里Context就像是舞台,Beans组件就像演员和团队,Core组件就像是道具。

Core组件
包含了很多的关键类,其中一个重要组成部分就是定义了资源的访问方式,比如Resource类封装了资源类型,ResourceLoader类封装了资源的加载。
Core组件更像是公共类或者工具类,用来为Context组件和Beans组件提供基础功能
Beans组件
Spring中使用BeanDefinition来抽象bean的定义,是主要的数据存储结构,可以表现出bean的配置信息和依赖关系。
Spring会解析定义的
BeanFactory是Spring提供的面向Spring内部的工厂类,它可以解析BeanDefinition并在getBean对象的时候进行对象的实例化。
构造BeanFactory需要传入Resource,它会自己创建reader来解析并注册BeanDefinition,但是不会创建。
比如:BeanFactory -> HierarchicalBeanFactory -> ConfigurableBeanFactory
BeanFactory:基本规范,比如说getBean()
HierarchicalBeanFactory:管理双亲IoC容器规范,比如说getParentBeanFactory(),双亲机制可以使子类(不是继承而是parent对象)拿到父类的对象,但是不能反过来,而且子类之前不相通。
ConfigurableBeanFactory:配置功能,比如setParentBeanFactory(),addBeanPostProcessor()
Context组件
Context组件就是ApplicationContext及其实现,ApplicationContext虽然是BeanFactory的继承,但是会通过在内部创建一个BeanFactory来实现bean对象的创建
比如:BeanFactory -> ListableBeanFactory/HierarchicalBeanFactory -> ApplicationContext -> ConfigurableApplicationContext
ListableBeanFactory:细化功能,比如说getBeanDefinitionNames()
ApplicationContext:继承MessageSource、ResourceLoader、ApplicationEventPublisher接口,添加了许多高级特性
IoC过程
IoC整个的过程依靠的是使用ApplicationContext类的refresh作为入口,主要有以下过程:
构建 BeanFactory
创建BeanFactory对象,同时也是获取BeanDefinition的过程。
- 创建BeanFactory
容器需要一个Resource对象(比如ClassPathResource)来定位Bean定义,从而可以在不同环境下读取数据,比如文件系统和Web容器。 ApplicationContext会用Resource来创建内部的BeanFactory
- 载入和解析
这里是调用loadBeanDefinitions方法,而这个方法是由ApplicationContext的子类实现,主要就是用ResourceLoader去加载和解析BeanDefinition,ResourceLoader会把获得的定义交给BeanFactory进行注册
- Bean定义的注册
解析得到的BeanDefinition会放在ConcurrentHashMap中,并用name作为key
准备容器功能
这一部分是用来通过组合功能类或者改变BeanFactory来扩展和改变容器功能,这里加入的扩展类会在合适的时候调用,比如BeanPostProcessors就是在构造对象的时候,通过这些类可以实现InitializingBean,注解注入
- prepareBeanFactory:通过设置功能来保证基本的功能
- invokeBeanFactoryPostProcessors:调用Processor类来改变BeanFactory的功能
- registerBeanPostProcessors:设置Processor来执行bean对象创建之后操作
- registerListeners:这个方法之前都是注册监听事件
创建Bean实例对象
这一步就是finishBeanFactoryInitialization,就是把注册的Bean定义实例化成对象,这里会根据需要使用BeanFactory来创建对象,或者直接使用反射来创建对象,而创建的对象的过程就是getBean来触发的。
触发被监听的事件
这里会调用注册ApplicationListener来触发不同的事件
扩展功能
AOP
MVC
JDBC
事务