Spring框架的设计理念
1、Spring的总体架构
Spring框架中的核心组件只有三个:Core、Context和Bean。
(1)、Bean组件
主要解决三个问题:Bean定义、Bean创建、Bean解析。其中Bean定义和解析在Spring内部完成。
A、Bean创建的工厂模式:(顶级接口是BeanFactory)
最终默认实现类是DefaultListableBeanFactory。而BeanFactory的三个子类接口,分别表示这些Bean是可列表的、有继承关系的、定义Bean的自动装配规则。这四个接口共同定义了Bean的集合、Bean之间的关系和Bean的行为。
B、Bean的定义主要有BeanDefinition描述
C、Bean的解析(主要是对Spring配置文件的解析)
(2)、Context组件
提供Spring运行时的环境,用以保存各个对象的状态。ApplicationContext是Context的顶级父类。
ApplicationContext必须要完成以下几件事:
1) 标识一个应用环境。
2) 利用BeanFactory创建Bean对象。
3) 保存对象关系表。
4) 能够捕获各种事件。
Context作为Spring的Ioc容器,是大部分功能的基础。
(3)、Core组件
作为Spring的核心组件,其中包含了很多关键类,一个重要的组成部分就是定义了资源的访问方式。
Context把资源的加载、解析和描述工作委托给了ResourcePatternResolver类来完成,它把资源的加载、解析和资源的定义整合在一起便于其他组件使用。
(4)、Ioc容器如何工作
1、创建BeanFactory工厂
构建Ioc容器,入口在AbstractApplicationContext类的refresh方法,这个方法包含这样几个步骤:
1) 构建BeanFactory,以便产生所需的bean。
2) 注册可能感兴趣的事件。
3) 创建Bean实例对象。
4) 触发被监听的事件。
2、创建Bean实例并构建Bean关系网
Bean的实例化,是从finishBeanFactoryInitialization方法开始。
FactoryBean是个工厂Bean,可以产生Bean(Bean的实例)的Bean,使用的是getObject方法。
下图是Bean实例创建流程图:
通过调用getBean方法,创建Bean实例。
3、Ioc容器扩展点
对于Spring的Ioc容器,主要有BeanFactoryPostProcessor和BeanPostProcessor,它们分别在构建BeanFactory和构建Bean对象时调用。还有就是InitializingBean和DisposableBean,它们分别在Bean实例创建和销毁时被调用。用户可以实现这些接口中定义的方法,Spring会在适当的时候调用它们。
它们之间的关系可以用一个比喻来解释。
4、Spring中AOP特性详解
基于Ioc容器,Spring本身实现了很多扩展的特性功能,AOP无疑是最实用的一个。
AOP是基于JDK的动态代理实现的。
Proxy产生代理类的过程:
Spring AOP实现遵守AOP联盟的约定,同时Spring又扩展了它,增加了如Pointcut、Advisor等一些接口使得其更加灵活。
Spring调用拦截器:
以上图 来自《深入分析Java Web技术内幕》
参考书籍:
《深入分析Java Web技术内幕》