概念
AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。
1、横切关注点:对哪些方法进行拦截,拦截后怎么处理,这些关注点称之为横切关注点。
2、切面(aspect):类是对物体特征的抽象,切面就是对横切关注点的抽象
3、连接点(joinpoint):被拦截到的点,因为Spring只支持方法类型的连接点,所以在Spring中连接点指的就是被拦截到的方法.
4、切入点(pointcut):对连接点进行拦截的定义
5、通知(advice):所谓通知指的就是指拦截到连接点之后要执行的代码,通知分为前置、后置、异常、最终、环绕通知五类
6、目标对象:代理的目标对象
7、织入(weave):将切面应用到目标对象并导致代理对象创建的过程
8、引入(introduction):在不修改代码的前提下,引入可以在运行期为类动态地添加一些方法或字段.
讨论
1.什么是面向切面编程AOP?
这种在运行时,动态地将代码切入到类的指定方法、指定位置上的编程思想就是面向切面的编程。
2.前文提到jdk代理和cglib代理两种动态代理,优秀的spring框架把两种方式在底层都集成了进去,我们无需担心自己去实现动态生成代理。那么,spring是如何生成代理对象的?
如果有接口,则使用Jdk代理,反之使用Cglib。spring AOP综合两种代理方式的使用前提有会如下结论:如果目标类没有实现接口,且class为final修饰的,则不能进行spring AOP编程!
3.Spring AOP原理为什么用2种实现方式?JDKProxy和Cglib?
JDK动态代理只能代理接口类,所以很多人设计架构的时候会使用
XxxService, XxxServiceImpl的形式设计,一是让接口和实现分离,二是也有助于代理。
为什么不都使用Cgilb代理:
因为JDK动态代理不依赖其他包,Cglib需要导入ASM包,对于简单的有接口的代理使用JDK动态代理可以少导入一个包。
AOP 代理
- spring 默认使用 标准 jdk 动态代理,也可以使用 CGLIB 代理
spring aop 和 aspectj 的区别
其实对于AOP而言,AspectJ 也是一种非常优秀的解决方案,AspectJ 会在编译期对源码进行织入,从而达到方法增强的效果,不过要使用AspectJ 需要对字节码有一定的了解,而且还要学习AspectJ的语法,需要一定的学习成本。对于Spring 来说,采用动态织入的方法,在运行期生成代理类,从而达到增强的效果。