• spring-CGLib动态代理


    JDK实现动态代理需要实现类通过接口定义业务方法,对于没有接口的类,如何实现动态代理呢,这就需要CGLib了。CGLib采用了非常底层的字节码技术,其原理是通过字节码技术为一个类创建子类,并在子类中采用方法拦截的技术拦截所有父类方法的调用,顺势织入横切逻辑。JDK动态代理与CGLib动态代理均是实现Spring AOP的基础。

    1 package com.yztc.aop.bean;
    2 
    3 public class AccountDaoImpl2 {
    4     //代理对象
    5     public void add (String name){
    6         System.out.println("add:==="+name);
    7     }
    8 }
     1 package com.yztc.aop.bean;
     2 
     3 import org.springframework.cglib.proxy.Enhancer;
     4 import org.springframework.cglib.proxy.MethodInterceptor;
     5 import org.springframework.cglib.proxy.MethodProxy;
     6 
     7 import java.lang.reflect.Method;
     8 
     9 public class CglibProxy implements MethodInterceptor {
    10     private Enhancer enhancer =new Enhancer();
    11     public Object getProxy(Class clazz){
    12         //设置需要创建子类的类
    13         enhancer.setSuperclass(clazz);
    14         enhancer.setCallback(this);
    15         //通过字节码技术动态创建子类实例
    16         return enhancer.create();
    17     }
    18     //实现MethodInterceptor接口方法
    19     @Override
    20     public Object intercept(Object o, Method method, Object[] args, MethodProxy proxy) throws Throwable {
    21         System.out.println("前置代理");
    22         //通过代理类调用父类中的方法
    23         Object result = proxy.invokeSuper(o, args);
    24         System.out.println("后置代理");
    25         return result;
    26     }
    27 }
     1 package com.yztc.aop;
     2 
     3 import com.yztc.aop.bean.AccountDaoImpl2;
     4 import com.yztc.aop.bean.CglibProxy;
     5 
     6 public class TestMain {
     7     public static void main(String[] args) {
     8         CglibProxy proxy = new CglibProxy();
     9         //通过生成子类的方式创建代理类
    10         AccountDaoImpl2 proxy1 = (AccountDaoImpl2) proxy.getProxy(AccountDaoImpl2.class);
    11         proxy1.add("BINDU");
    12 
    13     }
    14 }
  • 相关阅读:
    GCD
    Android仿人人客户端(v5.7.1)——对从服务器端(网络)获取的图片进行本地双缓存处理(编码实现)
    systimestamp
    byte数组之间的赋值,byte和TCHAR数组的赋值
    如何修改hotspot默认信道
    Wifi的密码长度有何限制
    微信心跳机制
    如何内置iperf到手机中
    如何adb shell进入ctia模式
    本周推荐10款免费的网站模板设计
  • 原文地址:https://www.cnblogs.com/1218-mzc/p/7689022.html
Copyright © 2020-2023  润新知