jdk动态代理必须要求目标类实现一个接口。有的时候,程序可能不方便或者我们不想让一个类实现接口,也想创建这个项目类的代理对象,我们可以使用cglib动态代理。
一、引入cglib依赖的jar包
二、创建代理类对象的生成器
1 package com.aaa.proxy; 2 import com.aaa.proxy.advice.LogAdvice; 3 import net.sf.cglib.proxy.Enhancerimport net.sf.cglib.proxy.MethodInterceptor; 4 import net.sf.cglib.proxy.MethodProxy; 5 import java.lang.reflect.Method/** 6 * cglib动态代理 7 */ 8 public class CglibDynamicUtil implements MethodInterceptor { 9 /** 10 * 创建目标类对象的代理对象 11 * @param target 目标类的对象 目标类不需要实现接口 12 * @return 代理类对象 13 */ 14 public Object bind(Object target){ 15 Enhancer enhancer = new Enhancer(); 16 //传递一个MethodInterceptor接口的实现类对象 17 enhancer.setCallback(this); 18 //传递目标类Class对象 19 enhancer.setSuperclass(target.getClass())return enhancer.create(); 20 } 21 @Override 22 public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable{ 23 Object result = methodProxy.invokeSuper(o,objects); 24 //获取方法名 25 String methodName = method.getName(); 26 //判断methdnName 27 if(methodName.startsWith("save")||methodName.startsWith("delete")||methodName.startsWith("update")) { 28 new LogAdvice().log(methodName); 29 } 30 return result; 31 } 32 }
三、测试
1 package com.aaa.proxy.test; 2 import com.aaa.proxy.CglibDynamicUtil; 3 import com.aaa.proxy.entity.User; 4 import com.aaa.proxy.service.impl.UserServiceImpl; 5 /** 6 * cglib动态代理 7 */ 8 public class Test03 { 9 public static void main(String[] args) { 10 //创建cglib代理类对象生成器 11 CglibDynamicUtil cglibDynamicUtil = new CglibDynamicUtil(); 12 //创建目标类对象 13 UserServiceImpl userService = new UserServiceImpl(); 14 //创建代理类对象 15 UserServiceImpl userServiceProxy = (UserServiceImpl)cglibDynamicUtil.bind(userService); 16 userServiceProxy.saveUser(new User()); 17 userServiceProxy.findById(10L); 18 } 19 }
注意:cglib动态代理不需要目标类实现一个接口。