SpringAOP的基础原理就是动态代理

有两种实现方式:
1)jdk动态代理

2)cglib动态代理

jdk动态代理和cglib动态代理的区别在于:

cglib没有接口(通过继承父类) 只有实现类。 
采用字节码增强框架cglib,在运行时 创建目标的子类 ,从而对目标类进行增强。

简单来说就是把目标类当jdk动态代理里的接口使用,把运行时创建的目标类的子类当jdk动态代理里的目标类使用。

下面通过一个案例来说明CGLIB动态代理

目标类 ,实现了三个业务

public class UserServiceImpl{

  //添加用户信息(addUser)
public void addUser() {
System.out.println("UserServiceDaoImpl addUser");
}

  //更新用户信息(updateUser)
public void updateUser() {
System.out.println("UserServiceDaoImpl updateUser");
}   //删除用户信息(deleteUser)
public void deleteUser() {
System.out.println("UserServiceDaoImpl deleteUser");
} }

切面类 ,用于增强功能的类,里面就是具体的功能方法(通知)

public class MyAspect {
//前方法
public void before(){
System.out.println("cglib_before"); }
//后方法
public void after(){
System.out.println("cglib_after");
}
}

工厂类

工厂类步骤如下: 
1.目标类 
2.切面类 
3.代理类 
3.1 核心类 
3.2确定父类 
3.3设置回调函数 
而在设置回调函数里面和jdk动态代理类似 
设置回调函数 MethodInterceptor接口等效于jdk invocationHandler接口 
intercept()等效于jdk invoke() 
intercept参数1 ,参数2,参数3 和invoke三个参数一样 
参数4,methodProxy 方法代理 
可以使用methodProxy.invokeSuper(proxy, args);来执行父类的方法

public class MyProxyFactory {
public static Object createUserService() {
//目标类
final UserServiceImpl userService = new UserServiceImpl();
//切面类
final MyAspect myAspect = new MyAspect();
//代理类 采用cglib 底层创建目标的子类
//核心类
Enhancer enhancer=new Enhancer();
//确定父类
enhancer.setSuperclass(UserServiceImpl.class);
/*
* 设置回调函数 MethodInterceptor接口等效于jdk invocationHandler接口
* intercept()等效于jdk invoke()
* 参数1 ,参数2,参数3 和invoke三个参数一样
* 参数4,methodProxy 方法代理
*/
enhancer.setCallback(new MethodInterceptor() { @Override
public Object intercept(Object proxy, Method method, Object[] args,
MethodProxy methodProxy) throws Throwable {
//前方法
myAspect.before();
//执行目标类的方法
Object obj=method.invoke(userService, args);
//后方法
myAspect.after();
return obj;
}
});
Object proxy=enhancer.create();
return proxy;
}
}

运行结果:

https://blog.csdn.net/su20145104009/article/details/54234607

SpringAOP之CGLIB字节码增强的更多相关文章

  1. JDK动态代理和CGLIB字节码增强

    一.JDK动态代理 Java 在 java.lang.reflect 包中有自己的代理支持,该类(Proxy.java)用于动态生成代理类,只需传入目标接口.目标接口的类加载器以及 Invocatio ...

  2. JVM插庄之一:JVM字节码增强技术介绍及入门示例

    字节码增强技术:AOP技术其实就是字节码增强技术,JVM提供的动态代理追根究底也是字节码增强技术. 目的:在Java字节码生成之后,对其进行修改,增强其功能,这种方式相当于对应用程序的二进制文件进行修 ...

  3. 从底层入手,解析字节码增强和Btrace应用

    这篇文章聊下字节码和相关的应用. 1.机器码和字节码 机器码(machine code),学名机器语言指令,有时也被称为原生码(Native Code),是电脑的CPU可直接解读的数据. 通常意义上来 ...

  4. 字节码增强技术-Byte Buddy

    本文转载自字节码增强技术-Byte Buddy 为什么需要在运行时生成代码? Java 是一个强类型语言系统,要求变量和对象都有一个确定的类型,不兼容类型赋值都会造成转换异常,通常情况下这种错误都会被 ...

  5. 深入浅出Java探针技术1--基于java agent的字节码增强案例

    Java agent又叫做Java 探针,本文将从以下四个问题出发来深入浅出了解下Java agent 一.什么是java agent? Java agent是在JDK1.5引入的,是一种可以动态修改 ...

  6. JVM——字节码增强技术简介

    Java字节码增强指的是在Java字节码生成之后,对其进行修改,增强其功能,这种方式相当于对应用程序的二进制文件进行修改.Java字节码增强主要是为了减少冗余代码,提高性能等. 实现字节码增强的主要步 ...

  7. Java字节码增强探秘

    Java字节码增强探秘 https://mp.weixin.qq.com/s/CH9D-E7fxuu462Q2S3t0AA

  8. Java字节码增强技术

    简单介绍下几种java字节码增强技术. ASM ASM是一个Java字节码操控框架,它能被用来动态生成类或者增强既有类的功能.ASM可以直接产生class文件,也可以在类被加载入Java虚拟机之前动态 ...

  9. 字节码增强-learnning

    jvm加载java的过程主要是: 编写java文件->进行java文件的编译->生成.class字节码文件->jvm通过类加载器去加载生成的二进制文件 java编译器将源码文件编译称 ...

随机推荐

  1. 阻止a标签跳页,使用单击事件函数处理该请求

    阻止a标签跳页href="javascript:void(0)" 单击该标签时 页面不跳页   使用单击事件函数来处理该单击请求  返回上一层页面 ---------------- ...

  2. 俄罗斯方块c/c++语言代码

    /*******************************/ /******Writer: GJ *******/ /******Language: C *******/ /******Date ...

  3. MYSQL数据的安装、配置

    linux安装mysql服务分两种安装方法: 1.源码安装,优点是安装包比较小,只有十多M,缺点是安装依赖的库多,安装编译时间长,安装步骤复杂容易出错. 2.使用官方编译好的二进制文件安装,优点是安装 ...

  4. java 线程安全和不安全

    线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用.不会出现数据不一致或者数据污染.(Vector,HashTa ...

  5. java spring中对properties属性文件加密及其解密

    http://blog.csdn.net/yaerfeng/article/details/26561791

  6. 17 facade

    客户不须要内部的实现,仅仅须要知道有这个功能就好了,(最少知识原则)

  7. 2016.03.10,英语,《Vocabulary Builder》Unit 05

    mal: means bad. malpractice [ˌmæl'præktɪs] n. 失职, 行为不当; malady ['mælədi] n. 病, 疾病, 弊病; malodorous [ˌ ...

  8. 编译安装FFmpeg 要支持xvid、x264、mp3、ogg、amr、faac

    编译安装FFmpeg 要支持xvid.x264.mp3.ogg.amr.faac libfaac    faac格式的编解码包libmp3lame    mp3格式编解码包libopencore-am ...

  9. Java NIO(二)缓冲区

    概念 缓冲区:一个用于特定基本数据类型的容器,由java.nio包定义的所有缓冲区都是Buffer抽象类的子类.其作用于与NIO的通道进行交互,数据从通道读入缓冲区,数据从缓冲区写入通道 Buffer ...

  10. nginx 与 Windows 错误

    设置根目录 root "D:/www/app"; proxy_pass 反向代理 404 location php 模块添加 fastcgi_split_path_info ^(( ...