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. Spring学习总结(18)——Spring整合Mysql数据库一主多从、多主多从配置

    一.新建jdbc.properties配置文件 master.jdbc.driverClassName=com.mysql.jdbc.Driver master.jdbc.url=jdbc:mysql ...

  2. ARP(地址解析协议)

    目录 1. ARP 概述 2. ARP 协议工作原理 3. ARP 缓存 4. ARP 报文格式 5. 抓包分析 5.1. ARP 请求报文 5.2. ARP 应答报文 6. 免费 ARP 7. AR ...

  3. robot Framework控制浏览器

    向下 向上为负值

  4. codevs——T1048 石子归并

     http://codevs.cn/problem/1048/  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解       题目描述 Descriptio ...

  5. JeeSite(2):导入数据,进入系统

    本文的原文连接是: http://blog.csdn.net/freewebsys/article/details/50954485 未经博主同意不得转载. 博主地址是:http://blog.csd ...

  6. linux中设置TAB键的宽度

    对于编程的人员来说,常常须要排版代码,这时候就须要TAB键,但TAB键的宽度太大,非常有可能代码太长,延伸到下一行,这个时候你就须要设置TAB键的宽度了. linux下设置TAB键的宽度,做法例如以下 ...

  7. .net mvc Model 验证总结

    ASP.NET MVC4中的Model是自验证的,这是通过.NET4的System.ComponentModel.DataAnnotations命名空间完毕的. 我们要做的仅仅是给Model类的各属性 ...

  8. UVA 1149 Bin Packing 二分+贪心

    A set of n 1-dimensional items have to be packed in identical bins. All bins have exactly the samele ...

  9. Redis通过命令行进行配置

    redis 127.0.0.1:6379[1]> config set requirepass my_redis OK redis 127.0.0.1:6379[1]> config ge ...

  10. JDBC整理

    JDBC提供了独立于数据库的统一Api,用以执行SQL命令.JDBC API由以下常用的接口和类组成: DriverManagement:用于管理JDBC驱动的服务类,程序中使用该类的主要功能是获取C ...