目录
IOC
概念:
控制反转,把对象创建和对象之间的调用过程,交给spring管理。这样做的目的是降低耦合。
什么是耦合:
比如说两个对象之间的调用,如果使用一般方式的话,被调用的对象的类如果路径发生变化、方法发生变化则调用的那个对象就要改,这样两个对象之间依赖太强了,耦合度就太高了。
底层:
通过解析xml获取类路径,再利用对象工厂通过反射的方式创建对象存入Map(IOC容器)。
Spring提供的两种IOC容器实现方式:
Bean的生命周期:
定义一个类实现BeanPostProcessor接口,重写postProcessBeforeInitialization和postProcessAfterInitialization两个方法分别在初始化之前和之后执行。
AOP
面向切面编程,利用AOP可以对业务逻辑的各个部分进行隔离。从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发效率。
不通过修改源代码,在主干功能里面添加新功能。
底层原理:动态代理
有接口的话就用代理对象实现接口,对方法进行增强。
没接口的话就用代理对象继承类,对方法进行增强。
第一种使用的是JDK动态代理,第二种是CGLIB
过程:
使用Proxy类的newProxyInstance方法创建代理类
创建一个实现了InvocationHandler接口的类,这个类要传入需要增强方法的类的对象,然后重写invoke方法;这个方法可以在被增强函数的增加内容。最后使用newProxyInstance创建的代理类对象调用方法实际上就是调用被增强的invoke方法了。
事务操作
是一个对AOP的运用
事务的四个特性:
原子性:要么都成功要么都失败
一致性:操作前后数据完整性和状态不变
隔离性:两个事务之间互补产生影响
持久性:操作数据库的数据
事务传播行为:
指的就是当一个事务方法被另一个事务方法调用时,这个事务方法应该如何进行。
例如:methodA事务方法调用methodB事务方法时,methodB是继续在调用者methodA的事务中运行呢,还是为自己开启一个新事务运行,这就是由methodB的事务传播行为决定的。
主要的两种传播行为:
PROPAGATION_REQUIRED:
如果存在一个事务,则支持当前事务。如果没有事务则开启一个新的事务。
PROPAGATION_REQUIRED_NEW:
需要使用 JtaTransactionManager作为事务管理器。
它会开启一个新的事务。如果一个事务已经存在,则先将这个存在的事务挂起。
隔离级别isolation:
事务有一个特性是隔离性,多事务之间操作不会影响,不考虑隔离性会产生很多问题:脏读、不可重复读、虚(幻)读。
脏读(需要解决):一个未提交事务读取到了另一个未提交事务的数据
不可重复读:一个未提交事务读取到了另一提交事务修改的数据。
虚读:一个未提交事务读取到了另一提交事务增加的数据。