目录
前言
代理模式分为两种,一种是静态代理模式,一种是动态代理模式。静态代理模式:在程序运行之前需要写好代理类动态代理模式:在程序运行期间动态生成代理类
一、静态代理的实现模式?
首先创建一个接口(JDK代理都是面向接口的),然后创建具体实现类来实现这个接口,在创建一个代理类同样实现这个接口,不同之处在于,具体实现类的方法中需要将接口中定义的方法的业务逻辑功能实现,而代理类中的方法只要调用具体类中的对应方法即可,这样我们在需要使用接口中的某个方法的功能时直接调用代理类的方法即可,将具体的实现类隐藏在底层。
第一步:定义接口Iuser.java
package Test2;
public interface Iuser {
void eat(String s);
}
第二步:创建具体实现类UserImpl.java
package Test2;
public class UserImpl implements Iuser {
@Override
public void eat(String s) {
System.out.println("我要吃"+s);
}
}
第三步:创建代理类UserProxy.java
package Test2;
public class UserProxy implements Iuser {
private Iuser user = new UserImpl();
@Override
public void eat(String s) {
System.out.println("静态代理前置内容");
user.eat(s);
System.out.println("静态代理后置内容");
}
}
第四步:创建测试类ProxyTest.java
package Test2;
public class ProxyTest {
public static void main(String[] args) {
UserProxy proxy = new UserProxy();
proxy.eat("苹果");
}
}
二、动态代理
1.动态代理概念理解
动态代理是一种方便运行时动态构建代理、动态处理代理方法调用的机制,很多场景都利用类似机制做到的,比如用来包装RPC调用、面向切面的变成(AOP)
实现动态代理的方式很多,比如JDK自身提供的动态代理,就是主要利用了下面提到的反射机制。还有其他的实现方式,比如利用更高性能的字节码操作机制,类似ASM、cglib(基于ASM)、Javaassist 等。
2.Java 动态代理的作用是什么?
主要用来做方法的增强,让你可以在不修改源码的情况下,增强一些方法,在方法执行前后做任何你想做的事情,甚至根本不去执行这个方法,因为在InvocationHandler的invoke方法中,可以直接获取政治调用方法对应的Method对象,具体应用的话,可以添加调用日志,做事务控制等。
动态代理是设计模式当中代理模式的一种。(代理设计模式:为其他对象提供一种代理以控制这个对象的访问)
Java的动态代理是基于java.lang.reflect.Proxy、java.lang.reflect.invocationHandler两个类来完成的,使用了反射机制。
3.代理模式
通过代理模式默默的解决一些与业务无关的问题,比如远程、安全、事务、日志、资源关闭等,让应用开发者可以只关注他的业务。
----静态代理:事先写好代理类,可以手工编写,也可以工具生成。缺点是每个业务类都要对应一个代理类,非常不灵活。
----动态代理:运行时自动生成代理对象。缺点是生成代理对象和调用代理方法都要额外花费时间。
----JDK动态代理:基于Java 反射机制实现,必须要了解接口的业务类型才能用这种办法生成代理对象。新版本也开始结合ASM机制。
----cglib动态代理: 基于ASM机制实现,通过生成业务类的子类作为代理类。