Spring总结七:AOP动态代理的实现
Posted alex-zqzy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring总结七:AOP动态代理的实现相关的知识,希望对你有一定的参考价值。
Spring中的AOP代理可以使JDK动态代理,也可以是CGLIB代理,前者基于接口,后者基于子类。
首先我们来用代码简单演示jdk动态代理:
现在有一个商品的增删改查的操作
/** * 商品操作接口 */ public interface ProductService { public void add(); public void edit(); public void delte(); public void select(); } /** * 实现类 */ public class ProductServiceImpl implements ProductService { @Override public void add() { System.out.println("添加商品"); } @Override public void edit() { System.out.println("修改商品"); } @Override public void delte() { System.out.println("删除商品"); } @Override public void select() { System.out.println("查询商品"); } }
我们编写一个基于jdk的动态代理(实现InvocationHandler接口):
public class JdkProxy implements InvocationHandler { //被代理的目标 private Object target; //构造函数 传入目标对象 public JdkProxy(Object target) { this.target = target; } //提供创建代理对象的方法 public Object createProxy() { return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this); } /** * 实现InvocationHandler接口的回调方法, 拦截目标对象所有方法都会执行invoke方法 */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("我是代理,我对被代理的目标有绝对的控制权..."); Object returnVal = method.invoke(target, args); System.out.println("--------------------------------------"); return returnVal; } }
测试代码:
public class JdkProxyTest { @Test public void testJdkProxy() { //创建对象 ProductService target = new ProductServiceImpl(); //创建代理对象 JdkProxy jdkProxy = new JdkProxy(target); //代理面向接口 ProductService proxy = (ProductService) jdkProxy.createProxy(); //通过代理调用方法 proxy.add(); proxy.edit(); proxy.delte(); proxy.select(); } }
运行结果:
以上是关于Spring总结七:AOP动态代理的实现的主要内容,如果未能解决你的问题,请参考以下文章
Spring阶段性学习总结AOP编程入门学习之动态代理实现代码的优化