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