一:概述(知道)
Spring简介
Spring是以IOC和AOP为内核的full-stack轻量级开源框架Spring是以IOC和AOP为内核的full-stack轻量级开源框架
Spring发展历程
2004 年 03 月,1.0 版发布。
2006 年 10 月,2.0 版发布。
2007 年 11 月,更名为 SpringSource,同时发布了 Spring 2.5。
2009 年 12 月,Spring 3.0 发布。
2013 年 12 月,Pivotal 宣布发布 Spring 框架 4.0。
2017 年 09 月,Spring 5.0 发布
Spring优势
解耦
Spring就是一个大工厂,可以将所有对象的创建和依赖关系的维护工作都交给Spring容器的管理,大大的降低了组件之间的耦合性。
Aop编程支持
Spring提供了对AOP的支持,它允许将一些通用任务,如安全、事物、日志等进行集中式处理,从而提高了程序的复用性。
声明式事务
只需要通过配置就可以完成对事物的管理,而无须手动编程。
对测试的支持
Spring提供了对Junit4的支持,可以通过注解方便的测试Spring程序。
方便集成各种优秀框架
Spring不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如Struts、Hibernate、MyBatis、Quartz等)的直接支持。
** 对JavaEE API的封装**
Spring对Java EE开发中非常难用的一些API(如JDBC、JavaMail等),都提供了封装,使这些API应用难度大大降低。
优秀的源码
Spring核心结构
模块化思想的体现
Spring-Core
Spring-Aop
Spring-Dao
Spring-Context
Spring-Web
Spring-ORM
二:核心思想(理解)
IOC 控制反转
什么是IoC
创建对象的权利反转给框架,不需要我们自己new对象了,我们丧失了创建对象的权利,但是也得到了福利,不需要我们来管理对象了
IoC解决什么问题
解决对象之间耦合问题
IOC和DI的区别
同一件事情不同角度的描述
AOP 面向切面编程
横切逻辑:多个纵向流程中出现的重复子流程逻辑
本质
在不改变原有业务逻辑代码的情况下,增强横切逻辑,避免横切逻辑代码重复
为什么叫面向切面编程
切:横切逻辑,原有业务逻辑不能动
面:横切代码影响的往往是很多方法,构成了一个面
三:手写实现IOC和AOP(掌握)
分析案例,找出问题
问题一:new关键字将service层的实现类TransferServiceImpl
和Dao层的具体实现类JdbcAccountDaoImpl耦合在了一起,当需要切换Dao层实现类的时候必须得修改service代码,不符合面向接口开发的最优原则
问题二:service层没有添加事务控制,出现异常可能导致数据错乱,问题很严重,尤其在金融银行行业。
针对问题提出解决方案
针对问题一
手写IOC
反射+工厂模式
针对问题二
事务失效原因-->每次操作数据库都是一个新的连接
按照解决方案完成编码
1、ConnectionUtils提供了一个获取当前线程绑定Connection的方法
2、Service层事务管理逻辑代码单独提取为了事务管理器类TransactionManager(事务的开启、提交、回滚)
3、我们不可能给每一个方法添加TCF代码块来控制事务,所以使用动态代理技术,开发ProxyFactory
四:Spring IOC的应用(掌握)
说明
Bean定义方式不同、JavaSE/JavaEE环境不同,导致容器启动方式也会不同
BeanFactory和ApplicationContext的区别
Spring中IOC容器的顶级接口,定义基础规范;
ApplicationContext是容器的高级接口,比BeanFactory拥有更多的功能(比如XML读取)
IOC三种模式
模式一:纯XML模式
创建Bean的三种方式
class指定全限定类名,通过无参构造器创建
静态方法创建
实例化方法创建
Bean标签属性
id
class
scope
singleton
prototype
生命周期属性
init-method
destory-method
name
factory-bean
factory-method
DI依赖注入
构造器注入
使用<constructor-arg>标签
set注入
使用<property>标签,ref属性用于注入其它bean,value属性用于注入普通数值
模式二:XML+注解模式
模式三:纯注解模式
原则:从xml开始,学习注解时将xml中标签、属性与注解一一对应即可
IOC高级特性
lazy-init(了解)
FactoryBean和BeanFactory(重点)
BeanFactory是IOC容器的核心接口,它主要作用就是实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。
是一个工厂Bean,可以生成某一个类型Bean实例,它最大的一个作用是:可以让我们自定义Bean的创建过程
后置处理器(重点)
BeanPostProcessor,Bean对象后置处理器
BeanFactoryPostProcessor,Bean工厂后置处理器
BeanFactory初始化之后可以使用这个后置处理器做一些事情
其他
SpringBean生命周期
BeanDefinition对象
我们在 XML 中定义的 bean标签,Spring 解析 bean 标签成为⼀个 JavaBean,这个JavaBean 就是 BeanDefinition
五:Spring IOC源码深度剖析
好处
提⾼培养代码架构思维、深⼊理解框架
源码剖析技巧
原则
定焦原则:抓主线
宏观原则:站在上帝视⻆,关注源码结构和业务流程(淡化具体某⾏代码的编写细节)
⽅法和技巧
断点(观察调⽤栈)
反调(Find Usages)
经验(spring框架中doXXX,做具体处理的地⽅)
流程分析
循环依赖
循环依赖其实就是循环引⽤,也就是两个或者两个以上的 Bean 互相持有对⽅,最终形成闭环
场景
构造器的循环依赖(构造器注⼊)
Field 属性的循环依赖(set注⼊)
六:Spring AOP应用(掌握)
AOP相关术语
连接点JoinPoint
每个个方法的特殊时机点都是连接点,是一种候选点
切入点PointCut
用于定位真正感兴趣的方法
增强Advice
横切逻辑+访问信息(具体哪种连接点)
目标对象Target
代理对象Proxy
织入Weaving
切面Aspect
切面=切入点+增强=切入点+横切逻辑+方位信息
注意:这么多的概念,目的就是为了锁定在哪个地方插入什么横切逻辑代码
Spring AOP配置
XML配置
XML+注解
纯注解
Spring 声明式事务
回顾事务基本知识
四大特性、并发问题、隔离级别、传播行为
配置方式
xml配置
xml+注解
纯注解
七:Spring AOP源码剖析
代理对象创建流程
声明式事务控制组件分析--->从@EnableTransactionManagement开始