Spring相关
一、概述
什么是Spring?
一个轻量级框架,简化Java开发,主要依赖于两个核心特性,也就是依赖注入DI以及面向切面编程AOP
- 减少代码量
- 入侵性小
- 低耦合
- 支持声明式编程 、
- 方便继承各种优秀的框架
核心
- IOC:依赖反转,将对象之间的依赖关系交由IOC容器管理,实现解耦
- DI:依赖注入,依赖反转的一部分,将属性等信息的注入交由IOC容器管理
- AOP:面向切面编程,以动态非入侵的方式对服务进行增强,可以将饮用隔层的功能分离出来形成可重用的功能组件
设计模式
- 工厂模式:BeanFactory
- 单例模式:默认单例 (循环依赖问题,多例Prototype会直接抛出异常)
- 代理模式:AOP动态代理
- 模版方法:JdbcTemplate
- 观察者模式:管理一对多的依赖关系,一个对象的状态发生改变时,所有依赖于他的对象都会被动得到通知或更新,ApplicationListener
- 策略模式:AOP中两种动态代理方法,基于JDK动态代理以及基于CGLIB的动态代理,主要区别是判断该类是否实现接口
核心容器模块
BeanFactory是最基本的接口,为,他使得Spring成为一个容器
五种事件类型
- 上下文更新:refresh
- 开始:start
- 停止:stop
- 关闭:close
- 请求处理事件
详细介绍:
-
IOC:将程序代码的直接操控对象的调用权交给容器,有容器来实现对象的装配和管理
负责创建对象、管理对象、装配对象、配置对象并且管理这些对象的生命周期
优点;
1. 解耦
2. 方便管理
3. 封装了处理过程 -
支持功能:
- 依赖注入
- 依赖检查
- 自动装配
- 支持集合
- 指定初始化与销毁方法
- 支持回调某些方法(但略有入侵性)
-
容器的创建
- BeanFactory:最底层接口,所有bean的基本操作都在这里实现,读取bean配置文档、管理bean的加载、实例化、控制管理bean的生命周期,维护bean之间的依赖关系,只有getBean的时候懒加载初始化bean
- ApplicationContext:高级容器,不仅包含了BeanFactory还添加了许多新功能,预加载bean,其中refresh方法用于刷新整个容器,重新加载/刷新所有的bean
-
依赖注入DI:接口啊注入(很少)、构造器注入、setter方法注入
二者区别:
构造器注入 | setter方法注入 |
---|---|
没有部分注 | 支持部分注入 |
不会覆盖setter属性 | 会覆盖setter属性 |
任意修改都会创建新实例 | 不会创建新实例 |
适用于一次设置多个属性 | 适用于设置少属性 |
-
配置元数据
1. XML
2. 注解
3. Java -
配置文件:描述类信息,配置信息,以及相互调用,相当于一个bean配置的说明书
-
xml注入bean的方式
1. setter
2. 构造器:index、type
3. 静态工厂
4. 实例工厂 -
bean的作用域:
- singleton:单例,默认
- prototype:多例,谨慎,频繁创建销毁性能开销
- request:一个请求一个实例
- session:一个session对应一个
- global-session -
bean的生命周期
1. 实例化
2. 填充属性
3. 实现Aware接口,调用其中相关方法
4. 实现BeanPostProcessor的before方法
5. 实现InitializingBean的afterPropertiesSet方法
6. 调用自定义的初始化方法
7. 实现BeanPostProcessor的after方法
8. bean正常使用
9. DisposableBean的destory方法
10.调用自定义销毁方法 -
自动装配
- no
- byName
- byType
- constructor
- auto-detect
-
Spring事务:本质上还是数据库对事务的支持
- 编程式事务:灵活性高,但维护困难
- 声明式事务:将业务于事务管理分离,只需要配置来管理
-
Spring事务传播行为
- required:没有事务创建新事物,有事务加入食物
- supports:无非事务,有加入
- mandatory:无抛出异常,有加入
- requires_new:有无都创建新事物
- not-supported:有将事务挂起,其他以非事务运行
- never:使用以非事务运行,否则抛出异常
- nested:有嵌套在事务哪,没有按照required
-
Spring的事务隔离机制(具体请参考数据库的文档)
- default:数据库默认隔离级别
- read-uncommited:出现幻读、脏独、不可重复读
- read-commited:幻读、不可重复读
- repeatable-read:幻读
- serializable:最安全
-
AOP:面向切面编程,将于业务无关的却影响对哥对象的公共行为和逻辑,抽取并封装为一个可重用的模块,就叫做切面,减少了重复代码、影响空间耦合度、提高系统的可维护性
-
AOP实现方式:代理模式
- 静态代理:AspectJ,在编译阶段生成AOp代理类,在编译阶段将切买呢织入字节码中,运行时就是之后的AOP对象
- 动态代理:SpringAOP,不去修改字节码,而是在运行时在内存中临时生成一个AOP对象,该对象包涵目标对象全部方法,并在特定切点做了增强处理并回调元对象的的方法,Spring中提供两种方式:基于JDK于基于CGLIB,主要根据是否实现接口。。。/。/
-
。。。,。