# Spring
## ioc控制反转
指的是常规意义上的由程序直接创建对象改为由容器获取对象
解耦合
方便管理
# aop 切面式编程
aop底层实现:jdk动态代理-针对实现接口的类,cglib动态代理-针对未实现接口的类
aop要达到的效果就是,在保证不修改源码的情况下,对方法进行动态增强
主要作用就是分离业务以及与业务无关的开发任务,包括日志、事务、权限、监控等等
实现方式:
1、引入aspect依赖
2、启动类增加@EnalbeAspectAutoProxy
3、编写切面类,定义切面规则,可以定义包路径、方法返回、入参、生效bean等等
@Before、@After、@AfterReturning、@AfterThrowing、@Around
## spring用到了那些设计模式
单例 bean默认为单例模式
工厂 BeanFactort就是工厂模式的体现
代理 aop切面就是基于代理实现
## spring两个核心接口
### BeanFactory
可以认定为是一个hashMap,key是bean的className,value是具体实现
### ApplicationContext
上下文应用对象,继承BeanFactory,所以前者的功能它都有,而且还提供了读取配置文件,支持国家化功能
## spring bean的作用域
singleton-默认:springioc容器中仅存在一个实例
prototype:每次调用bean就创建一个实例
request:每次request请求创建一个实例
session:每个http session创建一个实例
## spring的ThreadLocal
针对每一个线程独立创建的一个空间,从而隔离了多个线程对数据的访问冲突
## spring事务的实现方式和原理
spring的事务本质上是基于数据库的,若数据库不支持事物,spring也是不可以的
## spring的事务实现方式
声明式事务 通过xml和注解来实现 @Transaction
编程式事务 通过代码编写来实现 TransactionTemplate.execute(业务)
## spring的事务隔离级别
用底层数据看的事务隔离级别
未提交读,最低隔离级别,事务未提交前,就可以被其他事务读取,会出现脏读、幻读、不可重复读
提交读,一个事务提交后才能被其他事务读取到,会出现幻读、不可重复读
可重复读,保证事务过程中,某个值和事务开始的时候读取到的值是一致的,可能出现幻读,mysql的默认隔离级别
序列化,级别最高,很少用
脏读:一个事务可能读取到其他事务未提交的数据
不可重复读:一个事务中,多次读取一个值,出现的结果不一样
幻读:一个事务中,读取到的数量产生变化,好像出现幻觉