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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
能坚持,总会有不一样的收获!
[***.219.124.196]2024年04月25日 11时53分58秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Google 为什么把几十亿行代码放在一个库
2019-05-01
Erlang 之父 Joe Armstrong 去世
2019-05-01
来不及了,世界读书日,送10本书
2019-05-01
速来,上期中奖名单
2019-05-01
一名 Google 工程师的大数据处理经验
2019-05-01
30分钟学会pyecharts数据可视化
2019-05-01
从一个骗子身上学到的
2019-05-01
关于Python爬虫,这里有一条高效的学习路径
2019-05-01
Python学习指南,看这篇清晰多了!
2019-05-01
Oracle裁员,3点建议
2019-05-01
「忙」只是借口
2019-05-01
如果只有1小时学Python,看这篇就够了
2019-05-01
命名难,难于上青天
2019-05-01
记一件小事
2019-05-01
一个牛逼的数据库操作命令行工具:mycli
2019-05-01
掌握 Python 爬虫的所有技巧,都在这里!
2019-05-01
史上最烂项目:苦撑12年,600多万行代码...
2019-05-01
关于进程与线程,史上最浅显易懂的一个简单解释
2019-05-01
别人用B站看弹幕,我用B站搞爬虫
2019-05-01
把 14 亿中国人都拉到一个微信群,在技术上能实现吗?
2019-05-01