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

  • 相关阅读:
    vector<vector<int>> 判断三个数为一组是否重复
    数位dp——hdu2089不要62
    nyoj1099 四点坐标判断正方形
    构造回文——最长公共子序列问题 java
    nyoj08 一种排序
    记录一个protobuf枚举类型引发问题的分析和思考
    记录一下996.icu
    Android N requires the IDE to be running with Java 1.8 or later
    使用fresco后引发的关于造轮子的思考
    使用了一段时间的instant run 记录一下遇到的问题
  • 原文地址:https://www.cnblogs.com/yanpingping/p/10902815.html
Copyright © 2011-2022 走看看