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

  • 相关阅读:
    4.9cf自训9..
    数位dp-入门模板题 hdu2089
    熟能生巧 汽车停车入位技巧解析-倒车入库--侧边停车
    MyBatis参数传入集合之foreach动态sql
    jquery如何判断checkbox(复选框)是否被选中
    Mybatis关联查询(嵌套查询)
    Mysql 分页语句Limit用法
    $.ajax返回的JSON格式的数据后无法执行success的解决方法
    JavaWeb学习总结(十二)——Session
    Spring MVC中Session的正确用法之我见
  • 原文地址:https://www.cnblogs.com/yanpingping/p/10902815.html
Copyright © 2020-2023  润新知