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();

    }
    }
    结果

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

  • 相关阅读:
    依赖注入模式【其他模式】
    缓存模式【其他模式】
    限流模式【其他模式】
    规范模式【其他模式】
    服务定位器【其他模式】
    原型继承模式【其他模式】
    Promise【其他模式】
    单态模式【其他模式】
    Git如何永久删除文件(包括历史记录)
    git中如何查看一个文件的修改(更新)历史
  • 原文地址:https://www.cnblogs.com/jasonboren/p/10565385.html
Copyright © 2011-2022 走看看