闫平平
写代码也要酷酷的!

导航

 

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动态代理不需要目标类实现一个接口。

 

posted on 2019-05-21 22:17  写代码也要酷酷的  阅读(193)  评论(0编辑  收藏  举报