Spring-AOP-Spring02
代理模式
为什么要学习代理模式,因为这就是Spring AOP的底层
代理模式分类:
- 静态代理
- 动态代理
静态代理
角色分析:
- 抽象角色,一般会使用接口或抽象类解决
- 真实角色:被代理的角色
- 代理角色:代理真实角色,代理真实角色后,我们一般会做一些附属操作
- 客户:访问代理对象的人
代码步骤:
-
接口
public interface Rent { public void rent(); }
-
真实角色
//房东 public class Host implements Rent{ public void rent() { System.out.println("房东租房"); } }
-
代理角色
public class Proxy implements Rent { private Host host; public Proxy() { } public Proxy(Host host) { this.host = host; } public void rent() { host.rent(); } public void seeHouse() { System.out.println("看房"); } }
-
客户端访问代理角色
public class Client { public static void main(String[] args) { Host host = new Host(); Proxy proxy = new Proxy(host); proxy.rent(); proxy.seeHouse(); } }
代理模式的好处:
- 可以使真实角色的操作更纯粹,不用关注公共业务
- 公共就交给代理角色,实现业务分工
- 公共业务出现扩展,方便扩展处理
缺点:
一个真实角色会产生一个代理角色,代码会翻倍
动态代理
动态代理和静态代理角色一样
动态代理的代理类是动态生成的不是我们直接写好的
动态代理分为两大类:基于接口的动态代理,基于类的动态代理
基于接口-JDK动态代理
基于类:cglib
字节码实现: javassist
两个类:Proxy 代理和InvocationHander反射包下的接口
动态代理好处:
-
可以使真实角色操作更加纯粹,不用关注一些公共业务
-
公共也可以交给代理角色,
公共业务发生扩展的时候,方便集中管理
一个动态代理类代理的是一个接口
一个动态代理类可以代理多个类,只要实现了通个接口
什么是AOP
面向切面编程
使业务耦合性降低,提高可重用性
AOP在spring中作用
提供声明式事务,允许用户自定义切面
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.6</version>
</dependency>
方式一:使用spring的api接口
方式二:使用自定义类
方式三:使用注解实现
整合mybatis
步骤:
- 导入相关jar包
- junit
- mybatis
- mysql
- spring相关
- aop织入
- mybatis-spring【new】
- 编写配置文件
- 测试
回忆mybatis
- 编写实体类
- 编写核心配置文件
- 编写接口
- 编写mapper.xml
- 测试
Mybatis-spring
http://mybatis.org/spring/zh/getting-started.html
- 编写数据源
- sqlSessionFactory
- sqlSessionTemplate
- 需要给接口加实现类
- 将自己写的实现类注入到spring中
- 测试使用
声明式事务
回顾事务
- 把一组业务当成一个业务来做,要么都成功,要么都失败
- 事务在项目开发中十分重要,涉及到数据一致性问题
- 确保完整性和一致性
事务的acid原则
A:原子性
C:一致性
I:隔离型
多个业务可能操作同一个资源,防止数据损坏
D:持久性
事务一旦提交,无论系统发生什么问题,结果不会被影响,被持久化到存储器中
spring中的事务管理
- 声明式事务:AOP
- 编程式事务:需要做代码中,进行事务的管理
思考:
为什么需要事务
- 如果不配置事务,可能存在数据提交不一致的情况
- 如果我们不在srping中配置声明式事务,我们就需要做代码中手动陪孩子事务
- 事务在项目的开发中十分重要,涉及到数据的一致性和完整性问题