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

posted @ 2019-06-04 10:13  _luckyz  阅读(163)  评论(0编辑  收藏  举报