AOP的底层实现:JDK动态代理与Cglib动态代理
转载自 https://www.cnblogs.com/ltfxy/p/9872870.html
SpringAOP底层的实现原理:
- JDK动态代理:只能对实现了接口的类产生代理。(实现接口默认JDK动态代理,底层自动切换)
- Cglib动态代理(类似Javassist第三方的代理技术):对没有实现接口的类产生代理对象。生成子类对象。
public class JdkProxy implements InvocationHandler { //设置需要代理增强的对象,传进代理类的构造s
private UserDao userDao; public JdkProxy(UserDao userDao){
this.userDao = userDao;
} //产生UserDao的代理方法
//lang.reflect.Proxy.newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)
public UserDao createProxy(){
UserDao proxy = (UserDao)Proxy.newProxyInstance(userDao.getClass().getClassLoader(), userDao.getClass().getInterfaces(), this);
return proxy;
} @Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//判断方法名是不是add,如果是,进行增强
if("add".equals(method.getName())){
//增强:进行权限校验
System.out.println("权限校验=======");
return method.invoke(userDao, args);
}
return method.invoke(userDao, args);
}
}
测试:
package com.spring4.demo1; import org.junit.Test; public class SpringDemo1 { @Test
// JDK动态代理
public void demo1() {
// 创建需要被代理的对象
UserDao dao = new UserDaoImpl();
// 创建代理
UserDao proxy = new JdkProxy(dao).createProxy();
proxy.add();
proxy.delete();
proxy.update();
proxy.find();
}
}
Cglib动态代理
Cglib:第三方开源代码生产类库,动态添加类的属性和方法
由于是第三方,需要引入jar包:Spring开发6个包,包含了Cglib
package com.spring4.demo2; import java.lang.reflect.Method; import org.springframework.cglib.proxy.Callback;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy; /**
* Cglib动态代理,增强没有实现接口的对象
*
*/
public class CglibProxy implements MethodInterceptor {
//设置要被增强的对象
public CustomerDao customerDao;
public CglibProxy(CustomerDao customerDao){
this.customerDao = customerDao;
} //设置CustomerDao的代理方法
public CustomerDao createProxy(){
//1 创建Cglib核心对象
Enhancer enhancer = new Enhancer();
//2 设置父类
enhancer.setSuperclass(customerDao.getClass());
//3 设置回调(类似InvocationHandler)
enhancer.setCallback(this);
//4 创建代理对象
CustomerDao proxy =(CustomerDao)enhancer.create();
return proxy;
} @Override
//进行增强
public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
//判断方法是否为add
//如果增强的方法存在,调用proxy代理,执行增强
//如果增强的方法不存在,通过代理对象找到父类并执行,不进行增强
if("add".equals(method.getName())){
System.out.println("权限校验=========");
return methodProxy.invokeSuper(proxy, args);
}
return methodProxy.invokeSuper(proxy, args);
} }
测试:
package com.spring4.demo2; import org.junit.Test; public class SpringDemo1 { @Test
// Cglib
public void demo1() {
//创建要被增强的对象
CustomerDao customerDao = new CustomerDao();
CustomerDao proxy = new CglibProxy(customerDao).createProxy();
proxy.add();
proxy.delete();
proxy.update();
proxy.find();
}
}
AOP的底层实现:JDK动态代理与Cglib动态代理的更多相关文章
- 【转载】Spring AOP详解 、 JDK动态代理、CGLib动态代理
Spring AOP详解 . JDK动态代理.CGLib动态代理 原文地址:https://www.cnblogs.com/kukudelaomao/p/5897893.html AOP是Aspec ...
- Java之代理(jdk静态代理,jdk动态代理,cglib动态代理,aop,aspectj)
一.概念 代理是什么呢?举个例子,一个公司是卖摄像头的,但公司不直接跟用户打交道,而是通过代理商跟用户打交道.如果:公司接口中有一个卖产品的方法,那么公司需要实现这个方法,而代理商也必须实现这个方法. ...
- jdk动态代理和cglib动态代理底层实现原理详细解析(cglib动态代理篇)
代理模式是一种很常见的模式,本文主要分析cglib动态代理的过程 1. 举例 使用cglib代理需要引入两个包,maven的话包引入如下 <!-- https://mvnrepository.c ...
- jdk动态代理与cglib动态代理例子
1.JAVA的动态代理特征:特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会存在关联关系,一个代理类的对象 ...
- java的静态代理、jdk动态代理和cglib动态代理
Java的代理就是客户端不再直接和委托类打交道,而是通过一个中间层来访问,这个中间层就是代理.使用代理有两个好处,一是可以隐藏委托类的实现:二是可以实现客户与委托类之间的解耦,在不修改委托类代码的情况 ...
- 浅谈Spring中JDK动态代理与CGLIB动态代理
前言Spring是Java程序员基本不可能绕开的一个框架,它的核心思想是IOC(控制反转)和AOP(面向切面编程).在Spring中这两个核心思想都是基于设计模式实现的,IOC思想的实现基于工厂模式, ...
- 静态代理、jdk动态代理、cglib动态代理
一.静态代理 Subject:抽象主题角色,抽象主题类可以是抽象类,也可以是接口,是一个最普通的业务类型定义,无特殊要求. RealSubject:具体主题角色,也叫被委托角色.被代理角色.是业务逻辑 ...
- JDK动态代理和CGLib动态代理简单演示
JDK1.3之后,Java提供了动态代理的技术,允许开发者在运行期间创建接口的代理实例. 一.首先我们进行JDK动态代理的演示. 现在我们有一个简单的业务接口Saying,如下: package te ...
- 基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务(@Trasactional)到底有什么区别。
基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务(@Trasactional)到底有什么区别. 我还是喜欢基于Schema风格的Spring事务管理,但也有很多人在用基于@Tras ...
- Spring -- <tx:annotation-driven>注解基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务(@Trasactional)的区别。
借鉴:http://jinnianshilongnian.iteye.com/blog/1508018 基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务(@Trasactional ...
随机推荐
- zepto的构造器$
在zepto中,通过$来构造对象 $ = function(selector, context){ return zepto.init(selector, context) } 由该函数,实际上,在调 ...
- LeetCode-两个结构分别遍历,然后合并
今天做了leetcode67题,两个2进制数相加,回想了一下其实有很多这种类型的题,比如leetcode2两数相加. 在做这种题时我自己的思路就是先循环遍历一个短的,然后跳出循环,判断是哪个结束,再接 ...
- 分部视图(Partial View)及Html.Partial和Html.Action差异
参考资料: https://www.cnblogs.com/Leon-Hu/p/5575311.html
- SQL Server 本地数据库登录不上 解决方法
sql本地数据库登录不了的话.先看看自己计算机 服务 SQL server (MSSQLSERVER) 没有打开的话,请打开. 今天说的情景模式是 你误删了windows登录:禁用了sa登录:s ...
- C#、Python中分别是怎么实现通过字符串获取实体类的值以及给实体类赋值
一.引入 最近遇到一个项目里面的功能,在给实体类赋值的时候,由于赋值字段是动态生成的,所以如果用常用的方法(直接实体类的名称.字段名=要赋的值),将会生成很多无用的代码,所以找到了一个通过反射的赋值与 ...
- [Linux] 简单安装和使用composer
wget https://getcomposer.org/installer //下载一个脚本文件 php installer //php执行下这个php脚本 mv composer.phar /us ...
- 学习HttpClient,从两个小例子开始
前言 HTTP(Hyper-Text Transfer Protocol,超文本传输协议)在如今的互联网也许是最重要的协议,我们每天做的很多事情都与之有关,比如,网上购物.刷博客.看新闻等.偶尔你的上 ...
- Mysql中的外键分析(什么是外键,为什么要用外键,添加外键,主外键关联删除)
有一个东西一直在我脑海中是个很烦的东西,但是这东西不搞清楚会阻碍自己的前进.自己做项目demo永远只能用一张表... 所以今天还是学习了下外键希望能够搞明白一些... 百度上搜索外键的作用" ...
- JAVA面试题(8)
java基础以及多个“比较” 1.Collections.sort排序内部原理 在Java 6中Arrays.sort()和Collections.sort()使用的是MergeSort,而在Java ...
- PHP微信H5支付
今天项目用到了微信新出的h5支付直接去官网 https://pay.weixin.qq.com/wiki/doc/api/index.html找dome去了找了之后才发现没有一脸懵逼,一开始以为和公众 ...