定义
为其他对象提供一个代理,以控制对这个对象的访问。
UML
public interface Subject {
public void request();
}
class RealSubject implements Subject{
@Override
public void request() {
System.out.println("具体的业务处理逻辑");
}
}
class Proxy implements Subject{
Subject subject;
Proxy(Subject subject){
this.subject = subject;
}
@Override
public void request() {
before();
subject.request();
after();
}
private void before(){
System.out.println("before");
}
private void after(){
System.out.println("after");
}
}
特点
有静态代理、动态动态。动态代理有jdk的实现,也有cglib代理。
UML类图就是静态代理的形式。
示例
动态代理
使用反射或者字节码的技术,在运行期创建指定接口或类的子类,无侵入性的为代码进行增强。Java的动态代理技术主要有两种方法:1、JDK动态代理。2、CGLIB动态代理。
jdk动态代理原理
Proxy类:Proxy是所有动态代理的父类,它里面有一个静态方法newProxyInstance()创建动态代理的class对象和实例。
InvocationHandler接口:每个动态代理实例都有一个关联的InvocationHandler。代理对象执行方法会被转发到InvocationHandler的invoke()方法。
jdk动态代理示例
public interface StudentService {
public void getAll();
}
public class StudentServiceImpl implements StudentService {
@Override
public void getAll() {
System.out.println("查询所有学生");
}
}
public class StudentTest implements InvocationHandler {
private Object target;
public Object bind(Object target){
this.target = target;
return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("进入代理逻辑方法");
System.out.println("方法调用之前的逻辑");
Object obj = method.invoke(target, args);
System.out.println("方法调用之后的逻辑");
return obj;
}
public static void main(String[] args) {
StudentTest t = new StudentTest();
StudentService ss = (StudentService) t.bind(new StudentServiceImpl());
ss.getAll();
}
}
cglib动态代理原理
cglib也叫做子类代理,能够生成字节码代码,生成新的类。jdk动态代理必须要求有接口,而cglib不要求。当然被代理的类和方法不能是final修饰的。
cglib通过继承实现动态代理:
1、Enhancer:指定要代理的目标对象、实际处理代理逻辑的对象,最终通过调用create方法得到代理对象。
2、MethodInterceptor:动态代理对象的方法调用都会转发到intercept()方法进行增强。
cglib动态代理示例
public class TeacherService {
public void getAll() {
System.out.println("查询所有老师");
}
}
public class TeacherTest implements MethodInterceptor {
public static void main(String[] args) {
TeacherTest tt = new TeacherTest();
TeacherService pro = (TeacherService) tt.getProxy(TeacherService.class);
pro.getAll();
}
public Object getProxy(Class clazz){
Enhancer en = new Enhancer();
en.setSuperclass(clazz);
en.setCallback(this);
return en.create();
}
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("方法调用之前的逻辑");
Object result = methodProxy.invokeSuper(o, objects);
System.out.println("方法调用之后的逻辑");
return result;
}
}