设计模式是一套前人想出来解决特定问题的代码。
代理设计模式的好处:
1.保护真实对象
2.拓展功能
3.让真实对象职责更明确
代理模式三个点:
1.真实对象
2.代理对象
3.抽象功能
静态代理与动态代理:
静态代理的每一个功能都需要单独写, 如果功能较多会相当繁琐。
动态代理不需要频繁书写功能
两种动态代理:
JDK代理与cglib代理
JDK系统自带 不需要额外导包 。但是真实对象必须实现接口, 利用反射效率不高
cglib基于字节码,生成真实对象,效率很高
spring 选择两种代理
设置为 true 使用 cglib
设置为 false 使用 jdk(默认值)
<aop:aspectj-autoproxy proxy-target-class="true"></aop:aspectj-autoproxy>
JDK代理
package com.bjsxt;
public class Laozong implements Gongneng{
@Override
public void chifan() {
System.out.println("吃饭");
}
@Override
public void mubiao() {
System.out.println("目标");
}
}
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class Mishu implements InvocationHandler {
private Laozong laozong=new Laozong() ;
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("预约时间");
Object result = method.invoke(laozong, args);
System.out.println("记录访客信息");
return result;
}
}
cglib代理
package com.bjsxt;
import java.lang.reflect.Method;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
public class Mishu implements MethodInterceptor{
@Override
public Object intercept(Object arg0, Method arg1, Object[] arg2, MethodProxy arg3) throws Throwable {
System.out.println("预约时间");
//invoke()调用子类重写的方法
// arg1.invoke(arg0, arg2);
// arg3.invokeSuper(arg0, arg2);
Object result = arg3.invokeSuper(arg0, arg2);
System.out.println("备注");
return result;
}
}
package com.bjsxt;
public class Laozong {
public void chifan() {
System.out.println("吃饭");
}
public void mubiao() {
System.out.println("目标");
}
}