AspectJ和Spring AOP(java动态代理和CGLIB)简单介绍
1、AOP介绍
什么是AOP:AOP就是面向切面编程。使用的背景:
1)我们的振隆维护着一千个方法,一天老板让振隆把这一千个方法都要加上事务代码(统一代码)
2)振隆咬咬牙,添加了一个新的方法,然后让这一千个方法去调用这个事务的方法,解决了当前问题。
3)但是过了一段时间,老板又跑过来和振隆说,这一千个方法又要调用日志打印的方法功能,同时又要添加用户合法性验证。这个时候振隆有两种选择:1)对老板说:滚。2)使用aop技术来实现这个功能,以后老板随便加都可以轻松搞定。详细解说见(https://blog.****.net/wenbingoon/article/details/8988553)这篇文章的前面部分。
2、目前实现AOP的技术
目前实现AOP的技术:AspectJ和Spring AOP,这两个的核心区别:
1)AspectJ需要用到额外的编译器,这个比较麻烦,需要在工程外处理,不易于移植。AOP是在jdk基础上实现了,不用额外添加jdk外的执行文件。
2)因为是编译器期执行,在运行时没有开销,所以性能上AspectJ肯定是强于AOP的。
其他的一些不同可以参考如下:
3、Spring AOP的实现方式
Spring AOP实现主要是通过代理类的方式实现,有jdk代理和CGLIB代理两种方式,
1)CGLIB介绍:https://blog.****.net/danchu/article/details/70238002
2)CGLIB和Java动态代理的区别
2.1)Java动态代理只能够对接口进行代理,不能对普通的类进行代理(因为所有生成的代理类的父类为Proxy,Java类继承机制不允许多重继承);CGLIB能够代理普通类;
2.2)Java动态代理使用Java原生的反射API进行操作,在生成类上比较高效;CGLIB使用ASM框架直接对字节码进行操作,在类的执行过程中比较高效
3)Spring AOP默认的使用方式:
如果目标对象没有实现接口,则默认会采用CGLIB代理;
如果目标对象实现了接口,默认会采用Java动态代理;