代理模式
JDK动态代理:
是Spring最基本的代理,和CGLIB不一样的事JDK动态代理只能代理接口(返回的代理对象为目标类所实现的接口类型),不能代理类,这样,要代理的每一个对象都必须实现至少一个接口
CGLIB:
是一种类级别的代理对象,针对字节码进行代理的,不需要对每一个方法都进行拦截,判断。从性能上讲,CGLIB优于JDK动态代理。
-------------------------------------代理模式------------------------------------------------------------
1. 定义一个接口
2。创建一个被代理类 实现 接口
3. 创建调用类 实现 InvocationHandler接口 里面设置一个用于保存 代理类的 参数
4.代理类 通过 newProxy.newProxyInstance(...) 生成一个新的代理类,返回的是根据被代理类所实现的接口类型
参数 1 被代理类的加载 2 被代理类所实现的接口 3 InvocationHandler类的实例(记得属性保存代理类)
code:
-----------------------------------------------------------------------------------------------------------
creater a interface
public interface HandlerInter {
public void Handle(Object obj);
}
-----------------------------------------------------------------------------------------------------------
creater a ByProxyClass
import com.ye.inter.HandlerInter;
public class ByProxyObject implements HandlerInter{
public void Handle(Object obj) {
System.out.println("被代理对象执行");
-----------------------------------------------------------------------------------------------------------
creater a invocationhandler
//调用类
public class ProxyInvocation implements InvocationHandler {
private Object proobj; //保存代理类
//当代理类执行代理方法时候,自动调用该方法
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
String message = (String) args[0];
System.out.println("通知:在目标方法前拿到传递进来的参数:"+message);
Object obj = method.invoke(proobj, args); //调用目标方法 切入点
System.out.println("通知:目标方法执行后的通知");
return obj;
}
public Object getProobj() {
return proobj;
}
public void setProobj(Object proobj) {
this.proobj = proobj;
}
}
-----------------------------------------------------------------------------------------------------------
Test
import org.junit.Test;
import com.ye.inter.HandlerInter;
import com.ye.invocation.ProxyInvocation;
import com.ye.pojo.ByProxyObject;
public class Testing {
@Test
public void TestProxy(){
ByProxyObject bpo = new ByProxyObject(); //被代理类
ProxyInvocation pi = new ProxyInvocation();
pi.setProobj(bpo); //调用类保存代理类
HandlerInter hi = (HandlerInter) Proxy.newProxyInstance(bpo.getClass().getClassLoader(), bpo.getClass().getInterfaces(),
pi);
hi.Handle(new String("Hello 代理类")); //连接点
}
}