一般我们使用Aop对象时,常用动态代理模式,即是采用映射一个相同的类在此基础上进行前置后置操作。

动态代理多是采用原类实现父类接口,然后动态代理一个和原类相同的双胞胎兄弟类来实现映射。

父类

public interface InterF {
public void save();
}

需要映射的类

public class Origin implements InterF{
@Override
public void save() {
System.out.println("测试一下");
}
}

动态代理映射,此类需要传入相应的原类对象

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy; /**
* @author bai
* @create 2019-10-25-16:47
*/
public class ProxyJdk implements InvocationHandler { private Object target; public Object getProxy(Object target){
this.target=target;
return Proxy.newProxyInstance(this.getClass().getClassLoader(),target.getClass().getInterfaces(),this); } @Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("我来了");
Object invoke = method.invoke(target, args);
System.out.println("我走了");
return invoke;
}
}

测试类

public class Mytest {

    public static void main(String[] args) {
Origin o=new Origin();
ProxyJdk pj=new ProxyJdk();
InterF proxy = (InterF) pj.getProxy(o); proxy.save();
}
}

cglib模式的代理和动态代理大同小异,模式上相同,但cglib采用的是直接实现父子类,继承原类来实现映射。

原类

public class Origin{
public void save() {
System.out.println("测试一下");
}
}

cglib映射类,此类也需要传入原类

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy; import java.lang.reflect.Method; /**
* @author bai
* @create 2019-10-25-17:26
*/
public class CglibProxy implements MethodInterceptor{
private Object target;//被代理目标 public Object getProxy(Object target){
this.target=target;
Enhancer enhancer = new Enhancer();
//1.设置基类
enhancer.setSuperclass(target.getClass());
//2.设置回调接口
enhancer.setCallback(this);//MethodInterceptor实现类
//3.创建动态代理
return enhancer.create();
}
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("准备前");
Object invoke = method.invoke(target, objects);
System.out.println("准备后");
return invoke;
}
}

o是传入的对象,method是相应的切点所切方法,objects即参数。

测试类

public class Mytest2 {
public static void main(String[] args) {
Origin o=new Origin();
CglibProxy cp=new CglibProxy();
Origin proxy = (Origin) cp.getProxy(o);
proxy.save();
}
}

cglib相对于动态代理少了一个父类,更加便捷。且cglib使用时需要导入相应的jar包

Aop动态代理和cglib的更多相关文章

  1. Spring中AOP的两种代理方式(Java动态代理和CGLIB代理)

    第一种代理即Java的动态代理方式上一篇已经分析,在这里不再介绍,现在我们先来了解下GCLIB代理是什么?它又是怎样实现的?和Java动态代理有什么区别? cglib(Code Generation ...

  2. Spring中AOP的两种代理方式(Java动态代理和CGLIB代理-转载

    内容是摘抄的,不知最初的原作者,见谅 Java 动态代理.具体有如下四步骤: 通过实现 InvocationHandler 接口创建自己的调用处理器: 通过为 Proxy 类指定 ClassLoade ...

  3. JAVA高级架构师基础功:Spring中AOP的两种代理方式:动态代理和CGLIB详解

    在spring框架中使用了两种代理方式: 1.JDK自带的动态代理. 2.Spring框架自己提供的CGLIB的方式. 这两种也是Spring框架核心AOP的基础. 在详细讲解上述提到的动态代理和CG ...

  4. JDK动态代理和CGLIB的区别

    Aspect默认情况下不用实现接口,但对于目标对象,在默认情况下必须实现接口 如果没有实现接口必须引入CGLIB库 我们可以通过Advice中添加一个JoinPoint参数,这个值会由spring自动 ...

  5. SpringAOP-JDK 动态代理和 CGLIB 代理

    在 Spring 中 AOP 代理使用 JDK 动态代理和 CGLIB 代理来实现,默认如果目标对象是接口,则使用 JDK 动态代理,否则使用 CGLIB 来生成代理类. 1.JDK 动态代理 那么接 ...

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

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

  7. JDK动态代理和CGLIB代理的区别

    一.原理区别: java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理. 而cglib动态代理是利用asm开源包,对代理对象类的class文件 ...

  8. Spring -- <tx:annotation-driven>注解基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务(@Trasactional)的区别。

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

  9. Java三种代理模式:静态代理、动态代理和cglib代理

    一.代理模式介绍 代理模式是一种设计模式,提供了对目标对象额外的访问方式,即通过代理对象访问目标对象,这样可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对象的功能. 简言之,代理模式就是 ...

随机推荐

  1. PAT 甲级 1054 The Dominant Color (20 分)(简单题)

    1054 The Dominant Color (20 分)   Behind the scenes in the computer's memory, color is always talked ...

  2. Python - Django - 作者表多对多关联书籍表

    models.py 代码: from django.db import models # Create your models here. # 出版社 class Publisher(models.M ...

  3. (八)利用apache组件进行文件上传下载

    一.文件上传 文件上传,即服务器端得到并处理用户上传的文件,这个文件存放在request里,也就是需要对request进行处理. 1.1 编写html文件 <!DOCTYPE html> ...

  4. Spring Cloud(7.3):配置Consumer Server

    接下来我们创建一个消费者服务.消费者服务从生产者服务拿取商品-价格信息,并保存在Redis中.同时,接收消息队列中生产者服务的更新提示,如果某个商品-价格被修改,则删除Redis中的缓存数据,并重新从 ...

  5. 点击链接,取得href的值,但是不转向

    点击链接,取得href的值,但是不转向 $('.list a').click(function (e) {   e.preventDefault();//取消事件的默认动作.   $.ajax({   ...

  6. 【Leetcode_easy】783. Minimum Distance Between BST Nodes

    problem 783. Minimum Distance Between BST Nodes 参考 1. Leetcode_easy_783. Minimum Distance Between BS ...

  7. Andrew Ng机器学习课程11之使用machine learning的建议

    Andrew Ng机器学习课程11之使用machine learning的建议 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 2015-9-28 艺少

  8. 给引入页面的js和css资源加上版本号,防止浏览器缓存资源

    最近因为在做前端开发的相关工作,每次发布新版本以后,不到5分钟,测试童鞋一个接一个的抱怨说BUG根本就没有修改,这个时候你说的最多的话就是“清缓存!!清页面缓存!!你没有清缓存!!你清理了页面缓存就对 ...

  9. java连接zookeeper实现zookeeper的基本操作

    Java服务端连接Zookeeper,进行节点信息的获取,管理…,整理成一个基本工具, 添加依赖: <dependency> <groupId>org.apache.zooke ...

  10. redis批量删除键的操作

    网上也有很多关于批量删除的命令,例如,我们要删除以KEY开头的键.linux系统中当屏幕显示127.0.0.1:6379时,采用如下命令 redis-cli -h 192.168.1.1 -p 637 ...