spring基础(四)、spring AOP

一、基本概念:
AOP即面向切面编程,主要用来解决一些系统层面上问题,如日志、事物、权限等。与oop的比较,oop引入封装、继承、多态等概念,允许开发者定义纵向的关系;aop处理横向的关系,将那些影响了多个类的公共行为封装到可重用的模块

切面即那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低代码耦合性

AOP把软件系统分为两个部分:核心关注点和横切关注点。业务处理的主要流程是核心关注点,与之关系不大的部分是横切关注点。

二、AOP的基本概念
1、横切关注点
对哪些方法进行拦截,拦截后怎么处理,这些关注点称为横切关注点

2、切面(aspect)
即对横切关注点的抽象,在切面类上加上注解@Aspect

3、连接点(joinpoint)
指的就是被拦截到的方法、字段或者构造器
a> JoinPoint
JoinPoint对象封装了springAop切面方法的信息,在切面方法中添加JoinPoint参数,就可以获取到封装了该方法信息的JoinPoint对象

常用api:
Signature getSignature();	获取封装了署名信息的对象,在该对象中可以获取到目标方法名,所属类的Class等信息
Object[] getArgs();	获取传入目标方法的参数对象
Object getTarget();	获取被代理的对象
Object getThis();	获取代理对象

b>ProceedingJoinPoint
是JoinPooint的子接口,该对象只用在@Around切面方法中

api:
Object proceed() throws Throwable //执行目标方法 
Object proceed(Object[] var1) throws Throwable //传入的新的参数去执行目标方法 
两个方法.

4、切入点(pointcut)
对连接点进行拦截的定义

格式:
execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern)throws-pattern?) 

括号中各个pattern分别表示:

  • 修饰符匹配(modifier-pattern?)

  • 返回值匹配(ret-type-pattern)可以为*表示任何返回值,全路径的类名等

  • 类路径匹配(declaring-type-pattern?)

  • 方法名匹配(name-pattern)可以指定方法名 或者 代表所有, set 代表以set开头的所有方法

  • 参数匹配((param-pattern))可以指定具体的参数类型,多个参数间用“,”隔开,各个参数也可以用“”来表示匹配任意类型的参数,如(String)表示匹配一个String参数的方法;(,String) 表示匹配有两个参数的方法,第一个参数可以是任意类型,而第二个参数是String类型;可以用(…)表示零个或多个任意参数

  • 异常类型匹配(throws-pattern?)

  • 其中后面跟着“?”的是可选项

5、通知(advice)

  • @Before:前置通知;方法执行前通知
  • @after:后置通知,方法执行之后通知(无论是否发生异常,都通知)
  • @afterRunning:返回通知,在方法返回 结果之后通知(正常结束,才通知)
  • @afterThrowing:异常通知,在方法抛出异常后通知
  • @Around:环绕通知,通过调用 ProceedingJoinPoint 的 proceed() 方法来执行被代理的方法

6、目标对象

7、织入(weave)

将切面应用到目标对象并导致代理对象创建的过程

8、引入(introduction)

在不修改代码的前提下,引入可以在运行期为类动态地添加一些方法或字段

三:Spring对AOP的支持

Spring中AOP代理由Spring的IOC容器负责生成、管理,其依赖关系也由IOC容器负责管理。因此,AOP代理可以直接使用容器中的其它bean实例作为目标,这种关系可由IOC容器的依赖注入提供。Spring创建代理的规则为:

1、默认使用Java动态代理来创建AOP代理,这样就可以为任何接口实例创建代理了

2、当需要代理的类不是代理接口的时候,Spring会切换为使用CGLIB代理,也可强制使用CGLIB

遗留:连接点和切点的关系???

猜你喜欢

转载自blog.csdn.net/qq_34300892/article/details/86484121
今日推荐