SpringAOP之CGLIB字节码增强
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字节码增强的更多相关文章
- JDK动态代理和CGLIB字节码增强
一.JDK动态代理 Java 在 java.lang.reflect 包中有自己的代理支持,该类(Proxy.java)用于动态生成代理类,只需传入目标接口.目标接口的类加载器以及 Invocatio ...
- JVM插庄之一:JVM字节码增强技术介绍及入门示例
字节码增强技术:AOP技术其实就是字节码增强技术,JVM提供的动态代理追根究底也是字节码增强技术. 目的:在Java字节码生成之后,对其进行修改,增强其功能,这种方式相当于对应用程序的二进制文件进行修 ...
- 从底层入手,解析字节码增强和Btrace应用
这篇文章聊下字节码和相关的应用. 1.机器码和字节码 机器码(machine code),学名机器语言指令,有时也被称为原生码(Native Code),是电脑的CPU可直接解读的数据. 通常意义上来 ...
- 字节码增强技术-Byte Buddy
本文转载自字节码增强技术-Byte Buddy 为什么需要在运行时生成代码? Java 是一个强类型语言系统,要求变量和对象都有一个确定的类型,不兼容类型赋值都会造成转换异常,通常情况下这种错误都会被 ...
- 深入浅出Java探针技术1--基于java agent的字节码增强案例
Java agent又叫做Java 探针,本文将从以下四个问题出发来深入浅出了解下Java agent 一.什么是java agent? Java agent是在JDK1.5引入的,是一种可以动态修改 ...
- JVM——字节码增强技术简介
Java字节码增强指的是在Java字节码生成之后,对其进行修改,增强其功能,这种方式相当于对应用程序的二进制文件进行修改.Java字节码增强主要是为了减少冗余代码,提高性能等. 实现字节码增强的主要步 ...
- Java字节码增强探秘
Java字节码增强探秘 https://mp.weixin.qq.com/s/CH9D-E7fxuu462Q2S3t0AA
- Java字节码增强技术
简单介绍下几种java字节码增强技术. ASM ASM是一个Java字节码操控框架,它能被用来动态生成类或者增强既有类的功能.ASM可以直接产生class文件,也可以在类被加载入Java虚拟机之前动态 ...
- 字节码增强-learnning
jvm加载java的过程主要是: 编写java文件->进行java文件的编译->生成.class字节码文件->jvm通过类加载器去加载生成的二进制文件 java编译器将源码文件编译称 ...
随机推荐
- sso 登录业务逻辑
- (0)前言【从零开始学Spring Boot】
在此对整体技术简单说明下. 开发工具和开发环境: Win7 64位操作 Eclipse-jee-mars-2-win32-x86_64 Jdk 1.8 Maven管理项目 如果要学习Spring Bo ...
- servlet详细理解
生命周期 编辑 客户端请求该 Servlet: 加载 Servlet 类到内存: 实例化并调用init()方法初始化该 Servlet: service()(根据请求方法不同调用doGet() 或者 ...
- POJ 3243
Babystep算法.具体为什么,我也不太明白,好像资料不多. #include <iostream> #include <cstdio> #include <cstri ...
- 页面与后台传递中文乱码问题(java乱码)
1.前台中文传递到后台乱码. 前台不须要处理, 系统一般都会默认把中文转化为ISO-8859-1类型. 仅仅需在后台接受数据是处理 Str为前台传过来的中文字符串: String inputer = ...
- ios网络学习------3 用非代理方法实现异步post请求
#pragma mark - 这是私有方法.尽量不要再方法中直接使用属性,由于一般来说属性都是和界面关联的,我们能够通过參数的方式来使用属性 #pragma mark post登录方法 -(void) ...
- 【Xcode学C-1】怎样用Xcode练习C语言,并练习一个输出样例,以及重要的注意事项
直接用Xcode学习C语言,为iOS开发打基础. (1)选择OS X >>> Application >>> Command Line Tool (2)输入产品名称 ...
- ActiveX插件
C#制作ActiveX插件 首先新建项目--->类库,取名:ActiveXDemo 右键项目属性:应用属性==>程序集信息=>使程序集Com可见, 生成==>输出==>为 ...
- BZOJ 3105 线性基 高斯消元
思路: 按照从大到小排个序 维护两个数组 一个是消元后的 另一个是 按照消元的位置排的 不断 维护从大到小 (呃具体见代码) //By SiriusRen #include <cstdio> ...
- Node.js获取本机IP
function getIPAdress() { var interfaces = require('os').networkInterfaces(); for (var devName in int ...