代理
1、代理定义
给目标对象提供一个代理对象,并由代理对象控制对目标对象的引用
2、代理目的
(1)通过引入代理对象的方式来简介访问目标对象,防止直接访问目标对象给系统带来的不必要的复杂性
(2)通过代理对象对原有的业务增强
3、设计模式的原则
(1)单一职责原则
一个类或者一个借口只负责唯一一项职责,尽量设计出功能单一的接口;
(2)依赖倒转原则:
高层模块不应该依赖于底层模块具体实现,解耦高层与底层。即面向接口编程,当发生变化时,只需要提供新的实现类,不需要修改高层代码;
(3)开放–封闭原则:
程序对外扩展开发,对修改关闭;换句话说,当需求发生变化时,我们可以通过添加新模块来满足新的要求,而不是通过修改原来的代码来满足新的要求;
4、代理分为静态代理和动态代理
4.1静态代理
-
目标类和代理类需要实现同一个接口(dao接口)
-
静态代理类需要把真正的实现类传入到静态代理对象的构造方法。
4.2动态代理
(1)jdk动态代理(java自带)
使用动态代理需要实现InvocationHandler接口,并重写invoke方法
Proxy:动态生成代理对象
/**
* ClassLoader loader, 目标对象的类加载器
* Class<?>[] interfaces, 获得目标对象实现的所有接口
* InvocationHandler h,代理对象调用方法时会执行invoke方法
* @return 代理对象
*/
public static Object newProxyInstance(ClassLoader loader,
Class<?>[] interfaces,
InvocationHandler h)
InvocationHandler:规定了生成的动态代理对象之后的执行的方法
/**
* jdk动态代理的目的是增强事务,以及避免直接访问目标类带来的麻烦
* invoke 代理对象执行调用方法是会先执行invoke方法
* @param proxy 动态代理对象
* @param method jdk反射
* @param args 传递的参数
* @return
* @throws Throwable
*/
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
代理对象调用接口中任意方法都会调用invoke方法
举例
(2) cglib 动态代理
cglib底层使用了ASM(一个短小精悍的字节码操作框架)来操作字节码生成新的类。除了cglib库外,脚本语言(如Groovy和BeanShell)也使用ASM生成字节码。ASM使用类似SAX的解析器来实现高性能。
cglib使用步骤
(1)pom.xml文件导入依赖
(2)Enhancer
5、总结
jdk是针对于接口的动态代理
cglib主要针对于类的动态代理,也可以作接口的代理。但不能做被final修饰的代理
未完