AOP动态代理之CGLIB代理
Posted 花式编程
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AOP动态代理之CGLIB代理相关的知识,希望对你有一定的参考价值。
前言
JDk动态代理的使用非常简单,但它还有一定的局限性--使用动态代理的对象必须实现一个或多个接口,如果要对没有实现接口的类进行代理,那么可以使用CGLIB代理。
CGLIB是什么
CGLIB(Code Generation Library)是一个高性能开源的代码生成包,它爱用飞翔底层的字节码技术,对指定的目标类生成一个子类,并对子类进行增强,在Sprnig的核心包中已经集成了CGLIB所需要的包,所以开发中不需要另外导入JAR包。
实战
1.创建目标类
public class UserDao {
public void addUser(){
System.out.println("添加用户");
}
public void deleteUser(){
System.out.println("删除用户");
}
}
2.创建切面类
//切面类:可以存在多个通知Advice(即增强的方法)
public class MyAspect {
public void check_Permission(){
System.out.println("模拟检查权限");
}
public void log(){
System.out.println("模拟记录日志");
}
}
3.创建代理类CglibProxy
package com.aop.cglib;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
public class CglibProxy implements MethodInterceptor {
//代理方法
public Object createProxy(Object target){
//创建一个动态类对象
Enhancer enhancer = new Enhancer();
//确定需要增强的类,设置其父类
enhancer.setSuperclass(target.getClass());
//添加回调函数
enhancer.setCallback(this);
//返回创建的代理类
return enhancer.create();
}
/**
*
* @param proxy CGlib根据指定父类生成的代理对象
* @param method 拦截的方法
* @param args 拦截方法的参数数组
* @param methodProxy 方法的代理对象,用于执行父类的方法
* @return
* @throws Throwable
*/
@Override
public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
//创建切面类对象
MyAspect myAspect = new MyAspect();
//前增强
myAspect.check_Permission();
//目标方法执行
Object obj = methodProxy.invokeSuper(proxy,args);
//后增强
myAspect.log();
return obj;
}
}
上面代理类CglibProxy首先创建了一个动态类对象Enhancer,它是CGLIB的核心类;然后调用了Enhancer类的setSuperclass()方法来确定目标对象;接下类调用了setCallback()放天假回调函数,其中的this代表的 就是代理类CglibProxy本身;最后通过return语句将创建的代理类对象返回,intervept()方法会在执行目标方法时被调用,方法运行时将会执行切面类的增强方法。
4.创建测试类
package com.aop.cglib;
public class CglibTest {
public static void main(String[] args) {
//创建代理类
CglibProxy cglibProxy = new CglibProxy();
//创建目标对象
UserDao useDao = new UserDao();
//获取增强后的目标对象
UserDao userDao1 = (UserDao) cglibProxy.createProxy(useDao);
//执行方法
userDao1.addUser();
userDao1.deleteUser();
}
}
运行结果
推荐阅读:
如果看了有所帮助,转发,点赞,分享给那些还在迷茫的人吧。
喜欢记得来个赞
也可点击后台来撩我添加小编微信
以上是关于AOP动态代理之CGLIB代理的主要内容,如果未能解决你的问题,请参考以下文章
Java代理之(jdk静态代理/jdk动态代理/cglib动态代理/aop/aspectj)
Spring框架系列(11) - Spring AOP实现原理详解之Cglib代理实现
Spring读源码系列之AOP--06---AopProxy===>spring使用jdk和cglib生成代理对象的终极奥义