一切源于需求:
我只想写业务流程代码,不想管日志,权限,事务等业务无关的东西,怎么办?
要是我只写业务代码,想要其他代码的时候有人帮我写就好了。。。
于是,代理(代码小蜜)就出现了
代理有好多种实现方式呢:
AspectJ
首先,这是一种语言,类似于Java语言,与Java无缝兼容,而且像Java自带jvm一样,这种语言也自带编译器acj。
从上图可以看出,AspectJ在编译期就织入了代码,这个代理我们称之为 静态代理。
SpringAOP
Spring大行其道,所以AOP这块有了SpringAOP的出现。
当然,使AspectJ的方式也慢慢的退居到次要选择的地位了。。。
Spring一上来就 王炸,直接在运行时再织入,所以就是 动态代理 了。
SpringAOP借鉴了很多AspectJ的思想,就是在以上这一点与AspectJ不同。
SpringAOP并不是直接完成AOP的功能,其根据代理类是否实现接口有两种实现方式:
cglib
基于继承,通过目标类的字节码实例化目标类的一个子类来增强,所以不需要目标类实现某个接口就行。
java proxy
基于反射,代理和目标类实现相同的接口,完成目标类的增强,所以要求目标类必须实现某个接口。
以上,就是这几个的区别了。
简单即是美。。。