java代理

java里面代理分为了jdk代理了cglib代理

1.jdk的里面分为了动态代理和静态代理

1.1静态代理里面实现由:继承代理和聚合代理,

1.1.1继承代理实现:继承需要代理的类,对该类进行改造,然后调用该类。

1.1.2聚合代理就是要代理的对象需要实现接口,然后自己写代理类,代理类也要实现这个接口,在代理的时候把目标对象放入代理类,通过对代理对象进行改造

1.2动态代理:根据需要代理对象的接口,生成一个代理对象的java源码保存在物理空间上面,该代理对象生成的java代理会自动调用需要代理对象的方法,并加入额外的方法。之后又相关的代理工具把java源码进行编译加载初始化然后就可以使用。以上为原理,在实际使用中,只要implements InvocationHandler 这个接口,然后在需要代理的方法前后加入自己的逻辑,生成源码、编译、加载这些事情底层自己完成。

2.cglib代理:利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。cglib是针对类来实现代理的,原理是对指定的业务类生成一个子类,并覆盖其中业务方法实现代理,会产生class文件,也和上面一样动态的产生代理对象的代码,但是它是拿class文件进行操作(操作字节码技术)。因为采用的是继承,所以不能对final修饰的类进行代理。由于是继承方式,如果是 static方法,private方法,final方法是不能被代理的。

二者区别:

1、如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP 
2、如果目标对象实现了接口,可以强制使用CGLIB实现AOP 

3、如果目标对象没有实现了接口,必须采用CGLIB库,spring会自动在JDK动态代理和CGLIB之间转换

 

在spring里面的aop,就是有了jdk动态代理和cglib技术。cglib比jdk效率高。

jdk动态代理技术代理的类必须实现接口。cglib代理的类必须可以继承。他们都是在运行初期,通过各自的技术,动态的在方法区里面生成新的代理对象,然后把新的代理对象替换成原来的调用对象,实现偷天换日(代理的类都被spring管理,所有换起来非常简单)。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值