什么是代理模式:
在类的定义与调用之间加入一个中间件,代替该类向外实现功能
有一个图书类,实现了将书给用户的操作,而 BookStore 作为 Book 的代理类,在其中实现了用户付款的逻辑,用户实际是通过 BookStore 来对 Book 类的方法进行调用
Java 中实现动态代理主要用两种方式:基于 jdk 的动态代理与基于 cglib 的动态代理
jdk 基于接口实现
cglib 基于继承实现
cglib 的效率由于 jdk 的效率
基于 jdk 的动态代理
Book
package com.example.j2eedemo.proxy.jdk.saleBook;
public interface Book {
public void sale();
}
BookImpl
package com.example.j2eedemo.proxy.jdk.saleBook;
public class BookImpl implements Book {
@Override
public void sale() {
System.out.println("已将图书交给用户");
}
}
BookStore
package com.example.j2eedemo.proxy.jdk.saleBook;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class BookStore implements InvocationHandler {
// 被代理对象
private Object target;
public Object createProxyObject(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 {
Object result;
System.out.println("用户已付款");
result = method.invoke(target, args);
System.out.println("结束购买");
return result;
}
}
User
package com.example.j2eedemo.proxy.jdk.saleBook;
public class User {
public static void main(String[] args) {
BookStore store = new BookStore();
Book book = (Book) store.createProxyObject(new BookImpl());
book.sale();
}
}
User 类运行结果
基于 cglib 的动态代理
Book
package com.example.j2eedemo.proxy.cglib.saleBook;
public class Book {
public void sale(){
System.out.println("已将图书交给用户");
}
}
BookStore
package com.example.j2eedemo.proxy.cglib.saleBook;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
public class BookStore implements MethodInterceptor {
private Object target;
public Object createBookProxy(Object target){
this.target = target;
Enhancer enhancer = new Enhancer();
// 设置代理目标
enhancer.setSuperclass(target.getClass());
enhancer.setCallback(this);
return enhancer.create();
}
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
Object result;
System.out.println("用户已付款");
result = method.invoke(target, objects);
System.out.println("结束购买");
return result;
}
}
User
package com.example.j2eedemo.proxy.cglib.saleBook;
public class User {
public static void main(String[] args) {
BookStore store = new BookStore();
Book book = (Book) store.createBookProxy(new Book());
book.sale();
}
}
运行结果