一.静态代理模式
好处
可以使真正角色的操作更加纯粹,不用关注公共业务
公共业务交给代理角色,实现了业务分工
公共业务发生拓展的时候,方便集中管理
缺点
一个真实对象会产生一个代理角色,代码翻倍,开发效率会变低
步骤
接口 真实角色 代理角色 客户端访问代理角色
二.动态代理模式
1.基于接口的动态代理(JDK动态代理)
2.基于类的动态代理(cjlib)
3.Java字节码实现:javasist
需要了解俩个类: Proxy-代理 InvocationHandel-调用处理程序
动态代理没有真实的代理角色,只有实现了InvocationHandel接口的处理程序(做俩件事1.invoke执行它要真正执行的方法,2.得到代理类),
如何做上述俩件事:首先要调用程序 来设置真实要代理的角色,获得代理类,最后通过代理(Proxy就是动态生成的,我们并没有写)来调用方法
Proxy
生成动态代理实例的
提供创建动态代理类和实例的静态方法
InvocationHandler
代理实例调用处理程序 ,并返回一个结果的
每一个代理实例都有一个关联的调用处理程序,当在代理实例上调用方法时,方法调用将被编码并分派到其调用处理程序的invoke方法
好处:
一个动态代理类代理的是一个接口,一般对应的就是一类业务
一个动态代理类可以代理多个类,只要是实现了同一个接口即可
三.使用Spring实现AOP
使用AOP织入,需要导入一个依赖包
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.5</version>
</dependency>
方式一:使用spring的API接口【主要是springAPI接口】
代理类和被代理类都是实现了同一接口UserService, getBean返回的是 被创建的代理类,它只能向上转型为接口类型,不能转为为同级的UserServiceImpl
方式二:使用自定义类来实现AOP【主要是切面定义】
方式三:使用注解实现