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为生成的代理类对方法的代理引用

  • 相关阅读:
    CSS3学习笔记
    ie6对hover兼容性问题的解决:
    Maven-- 操作指南
    java基础 -- json多层转换成对象
    idea 导入maven项目
    工具的使用与安装--JAVA 环境变量的配置
    FreeMarker语言
    Apache Shiro 安全框架
    java基础--内部类
    java框架--Model层框架 sorm
  • 原文地址:https://www.cnblogs.com/lihuazhu/p/10971948.html
Copyright © 2011-2022 走看看