zoukankan      html  css  js  c++  java
  • 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();

    }
    }
    结果

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

  • 相关阅读:
    我眼中的DevOps
    Jenkins常用插件介绍之权限控制插件Role-based Authorization Strategy
    sql查询一个班级中总共有多少人以及男女分别多少人
    win8 图片等路径
    WPF 设置TextBox为空时,背景为文字提示。
    WCF服务发布
    win8 摄像
    oracle 删除主键
    oracle 数据库连接
    oracle 创建用户表
  • 原文地址:https://www.cnblogs.com/jasonboren/p/10565385.html
Copyright © 2011-2022 走看看