一 Spring aop中的基本概念
- 连接点(Joinpoint):在程序执行过程中某个特定的点,比如某方法调用的时候或者处理异常的时候。在Spring AOP中,一个连接点总是表示一个方法的执行。
通俗讲:层于层之间方法的调用过程称之为连接点。 - 切入点(Pointcut):匹配连接点的断言。通知和一个切入点表达式关联,并在满足这个切入点的连接点上运行(例如,当执行某个特定名称的方法时)。切入点表达式如何和连接点匹配是AOP的核心:Spring缺省使用AspectJ切入点语法。
通俗讲:
在连接点的基础上 增加上切入规则 选择出需要进行增强的连接点 这些基于切入规则选出来的连接点 就称之为切入点。 - 切面(Aspect):一个关注点的模块化,这个关注点可能会横切多个对象。事务管理是J2EE应用中一个关于横切关注点的很好的例子。在Spring AOP中,切面可以使用基于模式)或者基于@Aspect注解的方式来实现。
通俗讲:
狭义上就是 当spring拦截下切入点后 将这些切入点 交给 处理类 进行功能的增强,这个处理类就称之为切面。
广义上来讲 将spring底层的代理 切入点 和 处理类 加在一起 实现的 对层与层之间调用过程进行增强的机制 称之为切面。 - 通知(Advice):在切面的某个特定的连接点上执行的动作。其中包括了“around”、“before”和“after”等不同类型的通知(通知的类型将在后面部分进行讨论)。许多AOP框架(包括Spring)都是以拦截器做通知模型,并维护一个以连接点为中心的拦截器链。
通俗讲:
在spring底层的代理拦截下切入点后,将切入点交给切面类,切面类中就要有处理这些切入点的方法,这些方法就称之为通知(也叫增强 增强方法)。针对于切入点执行的过程,通知还分为不同的类型,分别关注切入点在执行过程中的不同的时机。 - 目标对象(Target Object): 被一个或者多个切面所通知的对象。也被称做被通知(advised)对象。 既然Spring AOP是通过运行时代理实现的,这个对象永远是一个被代理(proxied)对象。
通俗讲:
就是真正希望被访问到的对象。spring底层的动态代理对他进行了代理,具体能不能真的访问到目标对象,或在目标对象真正执行之前和之后是否做一些额外的操作,取决于切面。
二 SpringAOP的原理
Spring在创建bean时,除了创建目标对象bean之外,会根据aop的配置,生成目标对象的代理对象,将其存储,之后获取bean时得到的其实是代理对象,在代理对象中,根据配置的切入点规则,决定哪些方法不处理直接执行目标方法,哪些方法拦截后进行增强,需要增强的方法拦截后根据配置调用指定切面中的指定通知执行增强操作。
Spring自动为目标对象生成代理对象,默认情况下,如果目标对象实现过接口,则采用java的动态代理机制,如果目标对象没有实现过接口,则采用cglib动态代理。
开发者可以可以在spring中进行配置,要求无论目标对象是否实现过接口,都强制使用cglib动态代理。
三 五大通知类型
- 五种通知的常见使用场景
前置通知
记录日志(方法将被调用)
环绕通知
控制事务 权限控制
后置通知
记录日志(方法已经成功调用)
异常通知
异常处理 控制事务
最终通知
记录日志(方法已经调用,但不一定成功)