Spring - AOP之底层实现(动态代理 JDK VS CGLIB)
发布日期:2021-06-30 23:47:12 浏览次数:2 分类:技术文章

本文共 3365 字,大约阅读时间需要 11 分钟。

package com.imooc.aop.demo1;public interface UserDao {        public void save();    public void update();    public void delete();    public void find();}
package com.imooc.aop.demo1;public class UserDaoImpl implements UserDao {    public void save() {        System.out.println("保存用户...");    }    public void update() {        System.out.println("修改用户...");    }    public void delete() {        System.out.println("删除用户...");    }    public void find() {        System.out.println("查询用户...");    }}
package com.imooc.aop.demo1;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;public class MyJdkProxy implements InvocationHandler{    private UserDao userDao;    public MyJdkProxy(UserDao userDao){        this.userDao = userDao;    }    public Object createProxy(){        Object proxy = Proxy.newProxyInstance(userDao.getClass().getClassLoader(),userDao.getClass().getInterfaces(),this);        return proxy;    }    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {        if("save".equals(method.getName())){            System.out.println("权限校验...");            return method.invoke(userDao,args);        }        return method.invoke(userDao,args);    }}
package com.imooc.aop.demo1;import org.junit.Test;public class SpringDemo1 {    @Test    public void demo1(){        UserDao userDao = new UserDaoImpl();        UserDao proxy = (UserDao)new MyJdkProxy(userDao).createProxy();        proxy.save();        proxy.update();        proxy.delete();        proxy.find();    }}
运行结果:权限校验...保存用户...修改用户...删除用户...查询用户...

package com.imooc.aop.demo2;public class ProductDao {        public void save(){        System.out.println("保存商品...");    }    public void update(){        System.out.println("修改商品...");    }    public void delete(){        System.out.println("删除商品...");    }    public void find(){        System.out.println("查询商品...");    }}
package com.imooc.aop.demo2;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 MyCglibProxy implements MethodInterceptor{    private ProductDao productDao;    public MyCglibProxy(ProductDao productDao){        this.productDao = productDao;    }    public Object createProxy(){        // 1.创建核心类        Enhancer enhancer = new Enhancer();        // 2.设置父类        enhancer.setSuperclass(productDao.getClass());        // 3.设置回调        enhancer.setCallback(this);        // 4.生成代理        Object proxy = enhancer.create();        return proxy;    }    public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {        if("save".equals(method.getName())){            System.out.println("权限校验===================");            return methodProxy.invokeSuper(proxy,args);        }        return methodProxy.invokeSuper(proxy,args);    }}
package com.imooc.aop.demo2;import org.junit.Test;public class SpringDemo2 {    @Test    public void demo1(){        ProductDao productDao = new ProductDao();        ProductDao proxy = (ProductDao) new MyCglibProxy(productDao).createProxy();        proxy.save();        proxy.update();        proxy.delete();        proxy.find();    }}
运行结果:权限校验===================保存商品...修改商品...删除商品...查询商品...

 

转载地址:https://lux-sun.blog.csdn.net/article/details/84309683 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Spring - AOP之传统手动代理
下一篇:Spring - AOP之概述

发表评论

最新留言

能坚持,总会有不一样的收获!
[***.219.124.196]2024年04月25日 11时53分58秒