————————————
public interface IStudentService { void insertStudent(); void deleteStudent(); } public class StudentService implements IStudentService { public void insertStudent(){ //添加学生 } public void deleteStudent(){ //删除学生 } }
public class StudentService implements IStudentService { public void insertStudent(){ System.out.println("准备添加学生"); //添加学生 System.out.println("添加学生成功"); } public void deleteStudent(){ System.out.println("准备删除学生"); //删除学生 System.out.println("删除学生成功"); } }
public class StudentServiceProxy implements IStudentService { IStudentService studentService; public StudentServiceProxy(IStudentService studentService){ this.studentService = studentService; } @Override public void insertStudent() { System.out.println("准备添加学生"); studentService.insertStudent(); System.out.println("添加学生成功"); } @Override public void deleteStudent() { System.out.println("准备删除学生"); studentService.deleteStudent(); System.out.println("删除学生成功"); } }
在上面的代码中,代理类和业务类继承了相同的接口,并且重写了添加/删除学生的方法。
在重写的方法中,我们不仅可以调用业务类的原有方法,并且在调用的前后可以进行额外的处理,比如加上日志、事务等等。
这样一来,在客户端当中,我们只要创建了代理类,就可以像使用业务类一样使用它,非常方便:
public class Client { public static void main(String[] args) { IStudentService studentServiceProxy = new StudentServiceProxy(new StudentService()); studentServiceProxy.insertStudent(); studentServiceProxy.deleteStudent(); } }
以Java语言为例,Java为我们提供了十分方便的创建动态代理的工具包。当我们生成动态代理的时候,我们需要使用到InvocationHandler接口和Proxy类。
具体的实现过程如下:
1.实现InvocationHandler接口,定义调用方法前后所做的事情:
public class StudentInvocationHandler implements InvocationHandler { private IStudentService studentService; public StudentInvocationHandler(IStudentService studentService){ this.studentService = studentService; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println(method.getName() + "方法调用前"); method.invoke(studentService, args); System.out.println(method.getName() + "方法调用后"); return null; } }public class StudentInvocationHandler implements InvocationHandler { private IStudentService studentService; public StudentInvocationHandler(IStudentService studentService){ this.studentService = studentService; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println(method.getName() + "方法调用前"); method.invoke(studentService, args); System.out.println(method.getName() + "方法调用后"); return null; } }
2.通过Proxy类的newProxyInstance方法,动态生成代理对象:
public class Client { public static void main(String[] args) { IStudentService studentService = new StudentService(); InvocationHandler studentInvocationHandler = new StudentInvocationHandler(studentService); IStudentService studentServiceProxy = (IStudentService) Proxy.newProxyInstance(studentInvocationHandler.getClass().getClassLoader(), studentService.getClass().getInterfaces(), studentInvocationHandler); studentServiceProxy.insertStudent(); studentServiceProxy.deleteStudent(); } }