动态代理的实现方式及优缺点

  • 动态代理:是使用反射和字节码的技术,在运行期间(内存中)创建指定接口或类的子类以及实例化对象的技术,通过这个技术可以无侵入性的为代码进行增强扩展。

1、实现方式(目前有2种):

    a. JDK原生动态代理

    b. CGLIB动态代理

 

2、运行流程:

    一般的java对象实例化如下:

   动态代理方式运行如下:

  • 实现方式:

  1、JDK原生动态代理

   Proxy:Proxy是所有动态代理类的父类,它提供了一个静态方法newProxyInstance()来创建动态代理的class对象和实例。(生成代理类)

          InvocationHandler:每个动态代理实例都有一个关联的InvocationHandler,也就是说要实现InvocationHandler接口。在代理实例上调用方法时,方法的调用将被转发到InvocationHandlerinvoke()方法。(业务增强)

             示例:

UserServiceInterceptor usi = new UserServiceInterceptor();  //业务增强类

Class<?> class = UserServiceImpl.getClass(); //获取类对象

UserService proxy = (UserService)Proxy.newProxyInstance(class.getClassLoader(),class.getInterfaces(),usi);

proxy.addUser(new User());  //代理方法调用

  2、CGLIB动态代理

        CGLIB是一个基于ASM的字节码生成库,它允许我们在运行时对字节码进行修改和动态生成。CGLIB通过继承的方式实现。

         Enhancer:它是来指定要代理的目标对象、实际处理代理逻辑的对象,最终通过调用create()方法得到代理对象,对这个对象所有非final方法(子类无法对final方法重写)的调用都会转发给MethodInterceptor

        MethodInterceptor:动态代理对象的方法调用都会转发到intercept()方法进行增强,需要实现MethodInterceptor接口。

           示例:

Enhancer enhancer = new Enhancer(); //增强类对象
		
enhancer.setSuperclass(UserServiceImple.class); //设置增强类型
		
enhancer.setCallback(this); //定义代理逻辑对象为当前对象

UserServiceImple us = (UserServiceImple)enhancer.create();  //生成并返回代理对象

us.addUser(new User());  //代理方法调用
  • 优缺点:

       JDK原生动态代理是Java原生支持的,无需任何依赖,但是它只能基于接口进行代理。

       CGLIB通过继承的方式进行代理,无论目标对象偶没有实现接口都可以代理,但是无法处理final的情况。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值