java代理

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

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

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

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

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

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

java代理

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

二者区别:

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

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