课
堂
主
题
Spring架构分析及手写spring框架之ioc专题
课
堂
目
标
搞明白spring的体系结构
搞明白IoC的作用以及通过手写框架实现该功能
知
识要
点
课
堂
主
题
课
堂
目
标
知
识要
点
Spring
体
系结
构
1.核心容器
2.AOP和设备支持
3.数据访问及集成
4.Web
5.报文发送
6.Test
源
码
阅
读
篇
Spring重要接口详解
BeanFactory继承体系
体系结构图
BeanFactory
ListableBeanFactory
HierarchicalBeanFactory
AutowireCapableBeanFactory
ConfigurableBeanFactory
ConfigurableListableBeanFactory
BeanDefinitionRegistry
BeanDefinition继承体系
体系结构图
ApplicationContext继承体系
体系结构图
容器初始化流程源码分析
主流程源码分析
找入口
流程解析
创建BeanFactory流程源码分析
找入口
流程解析
加载BeanDefinition流程分析
找入口
流程图
流程相关类的说明
流程解析
Bean实例化流程分析
找入口
流程解析
AOP流程源码分析
查找BeanDefinitionParser流程分析
找入口
流程图
流程相关类的说明
流程解析
执行BeanDefinitionParser流程分析
找入口
流程图
流程相关类的说明
流程解析
产生AOP代理流程分析
AspectJAwareAdvisorAutoProxyCreator的继承体系
找入口
流程图
事务流程源码分析
获取TransactionInterceptor的BeanDefinition
找入口
流程图
流程解析
执行TransactionInterceptor流程分析
找入口
流程图
源
码
分
析
--
参
考
1.1 Spring核心容器体系结构
1.1.1 (1)BeanFactory
1.1.2 (2)BeanDefinition
1.2 IOC容器的初始化IOC容器的初始化包括BeanDefinition的Resource定位、载入和注册这三个基本的过
程。
1.2.1 1、XmlBeanFactory(屌丝IOC)的整个流程
1.2.2 2、FileSystemXmlApplicationContext的IOC容器流程
1.3 基于XML的依赖注入
1.3.1 依赖注入发生的时间
1.3.2 2、AbstractBeanFactory通过getBean向IOC容器获取被管理的Bean,
1.3.3 3、AbstractAutowireCapableBeanFactory创建Bean实例对象:
1.3.4 4、createBeanInstance方法创建Bean的java实例对象:
1.3.5 5、SimpleInstantiationStrategy类使用默认的无参构造方法创建Bean实例化对象:
1.3.6 6、populateBean方法对Bean属性的依赖注入:
1.3.7 7、BeanDefinitionValueResolver解析属性值:
1.3.8 8、BeanWrapperImpl对Bean属性的依赖注入:
1.4 基于Annotation的依赖注入
1.4.1 2.AnnotationConfigApplicationContext对注解Bean初始化:
1.4.2 3.AnnotationConfigApplicationContext注册注解Bean:
1.4.3 4.AnnotationConfigApplicationContext扫描指定包及其子包下的注解Bean:
1.4.4 5.AnnotationConfigWebApplicationContext载入注解Bean定义:
1.5 IOC容器中那些鲜为人知的事儿
1.5.1 1、介绍
1.5.2 2、SpringIOC容器的lazy-init属性实现预实例化:
1.5.3 3、FactoryBean的实现:
1.5.4 4、BeanPostProcessor后置处理器的实现:
1.5.5 5、SpringIOC容器autowiring实现原理:
手
写
框
架
篇
框架分析
组成Spring框架的每个模块集合或者模块都可以单独存在,也可以一个或多个模块联合实现。每个模块
的组成和功能如下:
1.
核
心容
器
由
spring-beans
、
spring-core
、
spring-context
和
spring-expression
(
Spring
Expression Language,SpEL
)
4
个
模
块
组
成
。
spring-beans
和
spring-core
模
块
是
Spring
框
架
的
核
心
模
块
,包含了
控
制
反
转
(
InversionofControl,IOC
)
和
依
赖
注
入
(
DependencyInjection,DI
)
。BeanFactory接口是
Spring框架中的核心接口,它是工厂模式的具体实现。BeanFactory使用控制反转对应用程序的配置
和依赖性规范与实际的应用程序代码进行了分离。但BeanFactory容器实例化后并不会自动实例化
Bean,只有当Bean被使用时BeanFactory容器才会对该Bean进行实例化与依赖关系的装配。
spring-context
模
块
构架
于
核
心
模
块
之上
,
他
扩
展
了
BeanFactory
,
为
她
添
加
了
Bean
生
命周
期控
制
、
框
架
事件体
系
以
及
资
源
加
载透
明
化
等
功
能
。
此外该模块还提供了许多企业级支持,如邮件访问、
远程访问、任务调度等,ApplicationContext是该模块的核心接口,她是BeanFactory的超类,与
BeanFactory不同,ApplicationContext容器实例化后会自动对所有的单实例Bean进行实例化与依赖
关系的装配,使之处于待用状态。
spring-expression
模
块
是
统
一
表
达
式
语言
(
EL
)
的
扩
展
模
块
,
可
以
查
询
、
管
理
运
行
中
的
对
象
,
同
时
也
方
便
的
可
以
调
用
对
象
方
法
、
操
作
数
组
、
集
合
等
。
它的语法类似于传统EL,但提供了额外的功能,
最出色的要数函数调用和简单字符串的模板函数。这种语言的特性是基于Spring产品的需求而设计,他
可以非常方便地同SpringIOC进行交互。
2.AOP
和
设
备
支持
由
spring-aop
、
spring-aspects
和
spring-instrument3
个
模
块
组
成
。
spring-aop
是
Spring
的
另
一
个
核
心
模
块
,
是
AOP
主
要
的
实
现模
块
。
作为继OOP后,对程序员影响最大
的编程思想之一,AOP极大地开拓了人们对于编程的思路。在Spring中,他是以JVM的动态代理技术为
基础,然后设计出了一系列的AOP横切实现,比如前置通知、返回通知、异常通知等,同时,Pointcut
接口来匹配切入点,可以使用现有的切入点来设计横切面,也可以扩展相关方法根据需求进行切入。
spring-aspects
模
块
集
成
自
AspectJ
框
架
,
主
要
是
为
SpringAOP
提
供
多
种
AOP
实
现
方
法
。
spring-instrument
模
块
是基于JAVASE中的"java.lang.instrument"进行设计的,应该算是AOP的
一个支援模块,主要作用是
在
JVM
启
用
时
,
生
成
一
个代
理
类
,
程
序
员
通过
代
理
类
在
运
行
时
修
改
类的
字
节
,
从
而
改
变
一
个
类的
功
能
,
实
现
AOP
的
功
能
。
在分类里,我把他分在了AOP模块下,在Spring官方文
档里对这个地方也有点含糊不清,这里是纯个人观点。
3.
数据
访
问
及
集
成
由
spring-jdbc
、
spring-tx
、
spring-orm
、
spring-jms
和
spring-oxm5
个
模
块
组
成
。
spring-jdbc
模
块
是Spring提供的JDBC抽象框架的主要实现模块,用于简化SpringJDBC。主要是提供
JDBC模板方式、关系数据库对象化方式、SimpleJdbc方式、事务管理来简化JDBC编程,主要实现类是
JdbcTemplate、SimpleJdbcTemplate以及NamedParameterJdbcTemplate。
spring-tx
模
块
是SpringJDBC事务控制实现模块。使用Spring框架,它对事务做了很好的封装,通过
它的AOP配置,可以灵活的配置在任何一层;但是在很多的需求和应用,直接使用JDBC事务控制还是有
其优势的。其实,事务是以业务逻辑为基础的;一个完整的业务应该对应业务层里的一个方法;如果业
务操作失败,则整个事务回滚;所以,事务控制是绝对应该放在业务层的;但是,持久层的设计则应该
遵循一个很重要的原则:保证操作的原子性,即持久层里的每个方法都应该是不可以分割的。所以,在
使用SpringJDBC事务控制时,应该注意其特殊性。
spring-orm
模
块
是
ORM
框
架支持
模
块
,主要集成Hibernate,JavaPersistenceAPI(JPA)和
JavaDataObjects(JDO)用于资源管理、数据访问对象(DAO)的实现和事务策略。
spring-jms模块(JavaMessagingService)能够发送和接受信息,自SpringFramework4.1以后,
他还提供了对spring-messaging模块的支撑。
spring-oxm模块主要提供一个抽象层以支撑OXM(OXM是Object-to-XML-Mapping的缩写,它是一个
O/M-mapper,将java对象映射成XML数据,或者将XML数据映射成java对象),例如:
JAXB,Castor,XMLBeans,JiBX和XStream等。
4.Web
由
spring-web
、
spring-webmvc
、
spring-websocket
和
spring-webflux4
个
模
块
组
成
。
spring-web
模
块
为
Spring
提
供了
最
基
础
Web
支持
,主要建立于核心容器之上,通过Servlet或者
Listeners来初始化IOC容器,也包含一些与Web相关的支持。
spring-webmvc
模
块
众
所
周
知
是
一
个
的
Web-Servlet
模
块
,
实
现
了
SpringMVC
(
model-view-
Controller
)
的
Web
应
用
。
spring-websocket模块主要是与Web前端的全双工通讯的协议。(资料缺乏,这是个人理解)
spring-webflux是一个新的非堵塞函数式ReactiveWeb框架,可以用来建立异步的,非阻塞,事件驱
动的服务,并且扩展性非常好。
5.
报文
发
送
即
spring-messaging
模
块
。
spring-messaging是从Spring4开始新加入的一个模块,主要职责是为Spring框架集成一些基础的报
文传送应用。
6.Test
即
spring-test
模
块
。