• CGLIB代理


    cglib和jdk代理对应,但是要实现jdk代理,其代理对象必须实现一个或多个接口,而cglib则不用实现接口,适用于没有实现接口的类的情况

    cglib需要实现MethodInterceptor接口和实现intercept()方法

    例如

    需要增强的目标类UserDao 

    public class UserDao {
    public void addUser(){
    System.out.println("添加用户");
    }
    public void deleteUser(){
    System.out.println("删除用户");
    }
    }

    切面类
    //切面类,用于增强UserDao 
    public class Myaspect {
    public void addBefore(){
    System.out.println("添加之前的检查");
    }
    public void deleteBefore(){
    System.out.println("删除之前的检查");
    }

    }
    代理类CglibProxy

    public class CglibProxy implements MethodInterceptor {

    public Object createProxy(Object target) {
    //动态类对象
    Enhancer enhancer = new Enhancer();
    //确定需要增强的类,设置成它的父类
    enhancer.setSuperclass(target.getClass());
    //添加回调函数
    enhancer.setCallback(this);
    //返回创建的代理类
    return enhancer.create();
    }

    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
    //创建切面类对象进行增强
    Myaspect myaspect = new Myaspect();
    myaspect.addBefore();
    //执行目标方法
    Object obj = methodProxy.invokeSuper(o, objects);
    myaspect.deleteBefore();
    return obj;
    }
    }

    测试
    public class CglibProxyTest {
    public static void main(String[] args) {
    //创建代理对象
    CglibProxy cglibProxy = new CglibProxy();
    //new userDao()表示目标对象
    //获取增强后的目标对象
    UserDao userDao = (UserDao) cglibProxy.createProxy(new UserDao());
    //执行方法,此时方法已经被增强了
    userDao.addUser();

    }
    }
    结果

    添加之前的检查
    添加用户
    删除之前的检查

  • 相关阅读:
    greybox关闭/刷新父窗口
    C# 获取文件编码
    框架页,URL中文参数乱码
    用来代替SQLSERVERAGENT的VBS脚本。
    jQuery的radio,checkbox,select操作
    mssql 的sp_help好难看
    如何判断网通、电信、铁通IP地址分配段
    IE8取不到 select 的option值
    如何识别当前的 SQL Server 版本号以及对应的产品级别
    控诉我的电脑
  • 原文地址:https://www.cnblogs.com/jasonboren/p/10565385.html
Copyright © 2020-2023  润新知