为什么要学习代理模式,因为这就是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反射包下的接口
动态代理好处:
可以使真实角色操作更加纯粹,不用关注一些公共业务
公共也可以交给代理角色,
公共业务发生扩展的时候,方便集中管理
一个动态代理类代理的是一个接口
一个动态代理类可以代理多个类,只要实现了通个接口
面向切面编程
使业务耦合性降低,提高可重用性
提供声明式事务,允许用户自定义切面
<dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.9.6</version> </dependency>方式一:使用spring的api接口
方式二:使用自定义类
方式三:使用注解实现
步骤:
导入相关jar包 junitmybatismysqlspring相关aop织入mybatis-spring【new】 编写配置文件测试http://mybatis.org/spring/zh/getting-started.html
编写数据源sqlSessionFactorysqlSessionTemplate需要给接口加实现类将自己写的实现类注入到spring中测试使用回顾事务
把一组业务当成一个业务来做,要么都成功,要么都失败事务在项目开发中十分重要,涉及到数据一致性问题确保完整性和一致性事务的acid原则
A:原子性
C:一致性
I:隔离型
多个业务可能操作同一个资源,防止数据损坏
D:持久性
事务一旦提交,无论系统发生什么问题,结果不会被影响,被持久化到存储器中
思考:
为什么需要事务
如果不配置事务,可能存在数据提交不一致的情况如果我们不在srping中配置声明式事务,我们就需要做代码中手动陪孩子事务事务在项目的开发中十分重要,涉及到数据的一致性和完整性问题