AOP学习笔记

来源:互联网 发布:网络中fr是什么意思 编辑:程序博客网 时间:2024/06/10 16:36

AOP学习笔记

AOP(Aspect-oriented programming),称为面向切面编程,是作为面向对象编程的一种补充。在OOP中将每个功能放在一个模块中实现以达到解耦和的目的,但是某些附属功能需要在多个模块中用到,比如日志输出等,使用AOP就可以很cool地将这些通用的附属功能注入到原有代码的目标位置(一个方法调用或者方法的入口)。

Spring AOP中的动态代理

AOP属于Spring的核心技术之一。Spring AOP中的动态代理主要有两种方式,JDK动态代理和CGLib动态代理。

JDK动态代理

JDK动态代理是通过反射来执行被代理的类中的方法,并且只支持接口的代理,即被代理的类必须实现一个接口。核心是InvocationHandler接口和Proxy类。
在程序运行的过程中,会生成一个代理类$Proxy0,继承了Proxy类,并实现了被代理的接口,Proxy类中会持有一个InvocationHandler的引用,而这个InvocationHandler引用中又持有被代理类的引用。用一个UML类图表示:
JDK动态生成代理类的类图
JDK动态代理不但代理了被代理接口中的方法,还代理了从Object中继承而来的equals、hashCode、toString这三个方法

CGLib动态代理

如果目标类没有实现接口,则需要使用CGLib库,这个库可以在运行时动态地生成某个目标类的子类,CGLib是通过继承的方式实现的动态代理,因此如果某个类被标记为final,那么它是无法通过CGLib实现动态代理的。

两种动态代理之间的差别:CGLib创建代理的速度比较慢,但是创建代理后运行熟读非常快,而JDK动态代理正好相反,所以不要在运行的过程中不断地用CGLib去创建代理(会使系统的性能大打折扣),所以建议在系统初始化的时候使用CGLib去创建代理。

AspectJ

AspectJ是一个完全兼容Java的,用于支持AOP的开源库,使用该库在java项目中实现AOP,需要AspectJ的编译工具ajc来编译。其实现原理图:
AspectJ原理

AspectJ在编译时就得到了目标代理对象,Spring AOP的动态代理则是在每次运行时动态的得到相应的代理对象,区别在于生成AOP代理对象的时机不同,相对来说AspectJ的静态代理方式具有更好的性能,但是使用AspectJ需要特定的编译工具ajc来编译,而Spring AOP则无需特定的编译工具。

参考

细说JDK动态代理的实现原理
cglib源码分析系列
AOP 那点事儿
AOP 那点事儿(续集)
Spring AOP的实现原理
深入理解Android之AOP
【翻译】Android中的AOP编程

0 0
原创粉丝点击