zoukankan      html  css  js  c++  java
  • cglib动态代理

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

  • 相关阅读:
    web前端的发展态势
    AngularJs 简单入门
    css代码优化篇
    git提交报错:Please make sure you have the correct access rights and the repository exists.
    Activiti工作流框架学习
    遍历map集合的4种方法
    js设置日期、月份增加减少
    Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986
    webservice_rest接口_学习笔记
    相互匹配两个list集合+动态匹配${}参数
  • 原文地址:https://www.cnblogs.com/yanpingping/p/10902815.html
Copyright © 2011-2022 走看看