动态代理之Cglib动态代理

68 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第8天,点击查看活动详情

哈喽,大家好!我是Why,一名在读学生,目前刚刚开始进入自己的编程学习生涯。虽然学习起步较晚,但我坚信做了才有0或1的可能。学了一段时间以后也是选择在掘金上分享自己的日常笔记,也希望能够在众多道友的大家庭中打成一片。 本文主要讲解动态代理之Cglib动态代理,如果大家读后觉得有用的话,还请大家多多支持博主:欢迎 ❤️点赞👍、收藏⭐、留言💬 ✨✨✨个人主页:JinHuan

Cglib动态代理

Cglib代理,也叫做子类代理。在内存中构建一个子类对象从而实现对目标对象功能的扩展 JDK的动态代理有一个限制,就是使用动态代理的对象必须实现一个或多个接口。如果想代理没有实现接口的类,就可以使用CGLIB实现。 CGLIB是一个强大的高性能的代码生成包,它可以在运行期扩展Java类与实现Java接口。它广泛的被许多AOP的框架使用,例如Spring AOP和dynaop,为他们提供方法的interception。 CGLIB包的底层是通过使用一个小而快的字节码处理框架ASM,来转换字节码并生成新的类。不鼓励直接使用ASM,因为它要求你必须对JVM内部结构包括class文件的格式和指令集都很熟悉。

BookService

 package com.jinhuan.service;
 ​
 /**
  * @Author jinhuan
  * @Date 2022/7/4 17:35
  * Description:没有实现接口的Service
  */
 public class BookService {
     public void add(Integer id,String name){
         System.out.println("BookService---add()---");
     }
 }

MyCglibProxy

 package com.jinhuan.cglibProxy;
 ​
 import com.jinhuan.aop.LogAop;
 import com.jinhuan.aop.TranAop;
 import com.jinhuan.service.BookService;
 import net.sf.cglib.proxy.Enhancer;
 import net.sf.cglib.proxy.MethodInterceptor;
 import net.sf.cglib.proxy.MethodProxy;
 ​
 import java.lang.reflect.Method;
 ​
 /**
  * @Author jinhuan
  * @Date 2022/7/4 17:34
  * Description:测试Cglib动态代理
  */
 public class MyCglibProxy {
     public static void main(String[] args) {
         //没有实现接口的被代理对象
         BookService bookService = new BookService();
         TranAop tranAop = new TranAop();
         LogAop logAop = new LogAop();
 ​
         //选择Cglib代理
         BookService cglibProxyService = (BookService) new CglibProxyFactory().getProxyInstance(bookService, tranAop);
         cglibProxyService.add(1,"jinhuan");
         
     }
     public static void main1(String[] args) {
         //没有实现接口的被代理对象
         BookService bookService = new BookService();
 ​
         //选择Cglib代理
         BookService bookProxyService = (BookService) Enhancer.create(bookService.getClass(), bookService.getClass().getInterfaces(),
                 new MethodInterceptor() {
                     @Override
                     public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
                         try {
                             System.out.println("开始事务!");
                             Object invoke = methodProxy.invokeSuper(o, objects);//核心部分
                             System.out.println("结束事务");
                             return invoke;
                         } catch(Exception e) {
                             System.out.println("事务回滚");
                             e.printStackTrace();
                             throw e;
                         }finally {
                             System.out.println("finally-----");
                         }
                     }
                 });
 ​
         bookProxyService.add(1,"jinhuan");
     }
 }

CglibProxyFactory

 package com.jinhuan.cglibProxy;
 ​
 import com.jinhuan.aop.Aop;
 import com.jinhuan.service.BookService;
 import net.sf.cglib.proxy.Enhancer;
 import net.sf.cglib.proxy.MethodInterceptor;
 import net.sf.cglib.proxy.MethodProxy;
 ​
 import java.lang.reflect.Method;
 ​
 /**
  * @Author jinhuan
  * @Date 2022/7/4 17:47
  * Description:
  */
 public class CglibProxyFactory {
     //没有实现接口的被代理对象
     private BookService bookService;
     private Aop aop;
 ​
 ​
     public Object getProxyInstance(BookService bookService,Aop aop){
         return Enhancer.create(bookService.getClass(), new MethodInterceptor() {
             @Override
             public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
                 try {
                     aop.before();
                     Object o1 = methodProxy.invokeSuper(o, objects);
                     aop.after();
                     return o1;
                 } catch(Exception e) {
                     aop.exception();
                     throw e;
                 } finally {
                     aop.myFinally();
                 }
             }
         });
     }
 }