AspectJ和Spring AOP(java动态代理和CGLIB)简单介绍

1、AOP介绍

什么是AOP:AOP就是面向切面编程。使用的背景:

1)我们的振隆维护着一千个方法,一天老板让振隆把这一千个方法都要加上事务代码(统一代码)

2)振隆咬咬牙,添加了一个新的方法,然后让这一千个方法去调用这个事务的方法,解决了当前问题。

3)但是过了一段时间,老板又跑过来和振隆说,这一千个方法又要调用日志打印的方法功能,同时又要添加用户合法性验证。这个时候振隆有两种选择:1)对老板说:滚。2)使用aop技术来实现这个功能,以后老板随便加都可以轻松搞定。详细解说见(https://blog.csdn.net/wenbingoon/article/details/8988553)这篇文章的前面部分。

2、目前实现AOP的技术

目前实现AOP的技术:AspectJ和Spring AOP,这两个的核心区别:

1)AspectJ需要用到额外的编译器,这个比较麻烦,需要在工程外处理,不易于移植。AOP是在jdk基础上实现了,不用额外添加jdk外的执行文件。

2)因为是编译器期执行,在运行时没有开销,所以性能上AspectJ肯定是强于AOP的。

其他的一些不同可以参考如下:

AspectJ和Spring AOP(java动态代理和CGLIB)简单介绍_第1张图片

(图片来自https://mp.weixin.qq.com/s?src=11×tamp=1539333289&ver=1177&signature=eBT8W1-qYrRBRkS--DwX9ruGZV-nSGNPwIemr0OOMdytxtr4rAbI13rXg0wogEVgCr9KGeA06cCYXzqzuSH-BTlMOjldrqwvZii-T0Qu9u0Oi-WJAeojax23*RFjDYWZ&new=1)

3、Spring AOP的实现方式

Spring AOP实现主要是通过代理类的方式实现,有jdk代理和CGLIB代理两种方式,

1)CGLIB介绍:https://blog.csdn.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动态代理; 

你可能感兴趣的:(java技术)