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动态代理不但代理了被代理接口中的方法,还代理了从Object中继承而来的equals、hashCode、toString这三个方法
CGLib动态代理
如果目标类没有实现接口,则需要使用CGLib库,这个库可以在运行时动态地生成某个目标类的子类,CGLib是通过继承的方式实现的动态代理,因此如果某个类被标记为final,那么它是无法通过CGLib实现动态代理的。
两种动态代理之间的差别:CGLib创建代理的速度比较慢,但是创建代理后运行熟读非常快,而JDK动态代理正好相反,所以不要在运行的过程中不断地用CGLib去创建代理(会使系统的性能大打折扣),所以建议在系统初始化的时候使用CGLib去创建代理。
AspectJ
AspectJ是一个完全兼容Java的,用于支持AOP的开源库,使用该库在java项目中实现AOP,需要AspectJ的编译工具ajc来编译。其实现原理图:
AspectJ在编译时就得到了目标代理对象,Spring AOP的动态代理则是在每次运行时动态的得到相应的代理对象,区别在于生成AOP代理对象的时机不同,相对来说AspectJ的静态代理方式具有更好的性能,但是使用AspectJ需要特定的编译工具ajc来编译,而Spring AOP则无需特定的编译工具。
参考
细说JDK动态代理的实现原理
cglib源码分析系列
AOP 那点事儿
AOP 那点事儿(续集)
Spring AOP的实现原理
深入理解Android之AOP
【翻译】Android中的AOP编程
- Spring AOP学习笔记
- Spring AOP学习笔记
- Spring AOP学习笔记
- Spring AOP学习笔记
- Spring AOP学习笔记
- spring aop学习笔记
- AOP学习笔记
- AOP学习笔记(2)
- AOP学习笔记
- spring aop学习笔记
- 学习笔记---------------AOP
- Spring AOP学习笔记
- spring AOP 学习笔记
- spring AOP学习笔记
- Spring AOP学习笔记
- Spring AOP学习笔记
- strust2 AOP学习笔记
- spring AOP 学习笔记
- android 图片高斯模糊
- java中this关键字用法小结
- com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after co
- 反转单链表的几种方法
- 从 inode 了解 Linux 文件系统
- AOP学习笔记
- html5布局适配rem
- pom.xml中各个标签 的意思
- UE4 打包初始位置不正确
- python中查看warning具体信息
- Atitit.软件兼容性原理与实践 v5 qa2.docx
- C语言的指针学习
- Android网络连接判断与处理
- python小波工具箱使用