AOP的底层实现:JDK动态代理与Cglib动态代理

时间:2023-02-17 22:34:49

转载自 https://www.cnblogs.com/ltfxy/p/9872870.html

SpringAOP底层的实现原理:

  • JDK动态代理:只能对实现了接口的类产生代理。(实现接口默认JDK动态代理,底层自动切换)
  • Cglib动态代理(类似Javassist第三方的代理技术):对没有实现接口的类产生代理对象。生成子类对象。
AOP的底层实现:JDK动态代理与Cglib动态代理
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);
}
}
AOP的底层实现:JDK动态代理与Cglib动态代理

测试:

AOP的底层实现:JDK动态代理与Cglib动态代理
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();
}
}
AOP的底层实现:JDK动态代理与Cglib动态代理

Cglib动态代理

Cglib:第三方开源代码生产类库,动态添加类的属性和方法

由于是第三方,需要引入jar包:Spring开发6个包,包含了Cglib

AOP的底层实现:JDK动态代理与Cglib动态代理

AOP的底层实现:JDK动态代理与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);
} }
AOP的底层实现:JDK动态代理与Cglib动态代理

测试:

AOP的底层实现:JDK动态代理与Cglib动态代理
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动态代理的更多相关文章

  1. 【转载】Spring AOP详解 、 JDK动态代理、CGLib动态代理

    Spring AOP详解 . JDK动态代理.CGLib动态代理  原文地址:https://www.cnblogs.com/kukudelaomao/p/5897893.html AOP是Aspec ...

  2. Java之代理(jdk静态代理,jdk动态代理,cglib动态代理,aop,aspectj)

    一.概念 代理是什么呢?举个例子,一个公司是卖摄像头的,但公司不直接跟用户打交道,而是通过代理商跟用户打交道.如果:公司接口中有一个卖产品的方法,那么公司需要实现这个方法,而代理商也必须实现这个方法. ...

  3. jdk动态代理和cglib动态代理底层实现原理详细解析&lpar;cglib动态代理篇&rpar;

    代理模式是一种很常见的模式,本文主要分析cglib动态代理的过程 1. 举例 使用cglib代理需要引入两个包,maven的话包引入如下 <!-- https://mvnrepository.c ...

  4. jdk动态代理与cglib动态代理例子

    1.JAVA的动态代理特征:特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会存在关联关系,一个代理类的对象 ...

  5. java的静态代理、jdk动态代理和cglib动态代理

    Java的代理就是客户端不再直接和委托类打交道,而是通过一个中间层来访问,这个中间层就是代理.使用代理有两个好处,一是可以隐藏委托类的实现:二是可以实现客户与委托类之间的解耦,在不修改委托类代码的情况 ...

  6. 浅谈Spring中JDK动态代理与CGLIB动态代理

    前言Spring是Java程序员基本不可能绕开的一个框架,它的核心思想是IOC(控制反转)和AOP(面向切面编程).在Spring中这两个核心思想都是基于设计模式实现的,IOC思想的实现基于工厂模式, ...

  7. 静态代理、jdk动态代理、cglib动态代理

    一.静态代理 Subject:抽象主题角色,抽象主题类可以是抽象类,也可以是接口,是一个最普通的业务类型定义,无特殊要求. RealSubject:具体主题角色,也叫被委托角色.被代理角色.是业务逻辑 ...

  8. JDK动态代理和CGLib动态代理简单演示

    JDK1.3之后,Java提供了动态代理的技术,允许开发者在运行期间创建接口的代理实例. 一.首先我们进行JDK动态代理的演示. 现在我们有一个简单的业务接口Saying,如下: package te ...

  9. 基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务(&commat;Trasactional)到底有什么区别。

    基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务(@Trasactional)到底有什么区别. 我还是喜欢基于Schema风格的Spring事务管理,但也有很多人在用基于@Tras ...

  10. Spring -- &lt&semi;tx&colon;annotation-driven&gt&semi;注解基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务(&commat;Trasactional)的区别。

    借鉴:http://jinnianshilongnian.iteye.com/blog/1508018 基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务(@Trasactional ...

随机推荐

  1. cocos2d-x使用python脚本创建项目的简单方法

    本文有CC原创,转载请注明地址:http://blog.csdn.net/oktears/article/details/13297003 在cocos2d-x2.1.4以上的版本中,取消了使用vs模 ...

  2. NOIP 2015提高组复赛

    神奇的幻方 题目描述 幻方是一种很神奇的N*N矩阵:它由数字1,2,3,……,N*N构成,且每行.每列及两条对角线上的数字之和都相同. 当N为奇数时,我们可以通过以下方法构建一个幻方: 首先将1写在第 ...

  3. centos7 rabbitmq系统部署

    CentOS7 1.安装系统 基础设施服务器:Java平台.Linux远程管理.开发工具 2.打开网络连接: (1)cd  /etc/sysconfig/network-scripts/  #进入网络 ...

  4. Js参数RSA加密传输,jsencrypt&period;js的使用

    注意几点: 1.参数传递的+号处理,在传输时会把+变成空格,不处理后端就报错了. 1.前段代码 <!DOCTYPE html> <html> <head> < ...

  5. openui5中的RESTful实现odata协议

    这篇文章第一次看到就一见如故,它是对过去一个时代分布式计算模型的总结,<分布式计算编程模型之RPC>:http://www.infoq.com/cn/news/2016/04/Distri ...

  6. 部署 apply plugin&colon; &&num;39&semi;realm-android&&num;39&semi;

    我在build.gradle中添加 apply plugin: 'realm-android' //依赖Realm数据库,插件化依赖  这个后,同步,清理,运行的时候报 应该在build.gradle ...

  7. 利用vcard和qrcode&period;js生成二维码导入联系人

    vCard是一种容许交换个人信息的数据规范,vCard数据格式的标识符是VCARD,vCard数据格式行是: 类型 [;参数]:值,具体的介绍百度都有,我们可以通过vcard来进行通讯录的保存,名片的 ...

  8. LinkedHashMap和HashTable

    LinkedHashMap: 继承了HashMap: 其中,key不允许重复是Map接口就有的性质: HashTable: 同步的,意味着是单线程,意味着线程安全的,但是速度慢,和List接口集合的子 ...

  9. request&period;getSession&lpar;&rpar;&period;setAttribute&lpar;&amp&semi;quot&semi;&amp&semi;quot&semi;&comma;&period;&period;&rpar;和request&period;setAttribute&lpar;&amp&semi;quot&semi;&amp&semi;quot&semi;&comma;&period;&period;&period;&rpar;的差别

    request.getSession.setAttribute()是获得当前会话的session,然后再setAttribute到session里面去,有效范围是session而不是request. ...

  10. &period;net core i上 K8S&lpar;三&rpar;Yaml文件运行&period;netcore程序

    上一章我们通过kubectl run简单运行了一个.netcore网站,但实际的开发中,我们都是通过yaml来实现的. 1.编写yaml文件 关于yaml文件的格式在此就不多描述了,不熟悉的可以去网上 ...