zoukankan      html  css  js  c++  java
  • 动态代理--Cglib

    JDK 的Proxy 实现,需要代理对象实现接口;

     1 package com.utils;
     2 
     3 import java.lang.reflect.InvocationHandler;
     4 import java.lang.reflect.Method;
     5 import java.lang.reflect.Proxy;
     6 
     7 import demo.CustomerDao;
     8 
     9 public class MyProxyUtils {
    10     public static CustomerDao getProxy(final CustomerDao dao) {
    11         CustomerDao proxy = (CustomerDao) Proxy.newProxyInstance(dao.getClass().getClassLoader(), dao.getClass().getInterfaces(), new InvocationHandler() {
    12             
    13             @Override
    14             public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    15                 if ("save".equals(method.getName())) {
    16                     System.out.println("记录日志////");
    17                 }
    18                 return method.invoke(dao, args);
    19             }
    20         });
    21         
    22         //返回代理对象
    23         return proxy;
    24         
    25     }
    26 }

    Cglib 不需要实现接口,用的是继承;

     1 package com.utils;
     2 
     3 import java.lang.reflect.Method;
     4 
     5 import org.springframework.cglib.proxy.Enhancer;
     6 import org.springframework.cglib.proxy.MethodInterceptor;
     7 import org.springframework.cglib.proxy.MethodProxy;
     8 
     9 import demo.BookDaoImpl;
    10 
    11 public class MyCglibUtils {
    12     public static BookDaoImpl getProxy() {
    13         Enhancer enhancer  =new Enhancer();
    14         enhancer.setSuperclass(BookDaoImpl.class);
    15         enhancer.setCallback(new MethodInterceptor() {   //MethodInterceptor的实现类
    16             
    17             @Override
    18             public Object intercept(Object obj, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
    19                 if ("update".equals(method.getName())) {
    20                     System.out.println("记录日志");
    21                 }
    22                 return methodProxy.invokeSuper(obj, args);
    23             }
    24         });
    25         //生成代理对象
    26         BookDaoImpl proxy = (BookDaoImpl) enhancer.create();
    27         return proxy;
    28         
    29     }
    30 }

     1、被代理类

    2、拦截器

      定义一个拦截器。在调用目标方法时,CGLib会回调MethodInterceptor接口方法拦截,来实现你自己的代理逻辑,类似于JDK中的InvocationHandler接口。

    3. 参数:Object为由CGLib动态生成的代理类实例,Method为上文中实体类所调用的被代理的方法引用,Object[]为参数值列表,MethodProxy为生成的代理类对方法的代理引用

  • 相关阅读:
    线程的阻塞与挂起
    Linux常用shell脚本
    eclipse黑色主题
    IntelliJ IDEA 注册码失效
    chkconfig命令具体介绍
    贪心算法
    【翻译自mos文章】job 不能自己主动执行--这是另外一个mos文章,本文章有13个解决方法
    C语言:冒泡排序法:将若干字符串按字母顺序(由小到大)排序输出
    SolrCloud:依据Solr Wiki的译文
    HDU 1260 Tickets (动规)
  • 原文地址:https://www.cnblogs.com/lihuazhu/p/10971948.html
Copyright © 2011-2022 走看看