欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spring AOP面向切面编程

程序员文章站 2022-07-12 14:10:47
...

首先,在面向切面编程的思想里面,把功能分为核心业务功能,和周边功能。 
所谓的核心业务,比如登陆,增加数据,删除数据都叫核心业务 
所谓的周边功能,比如性能统计,日志,事务管理等等 

 
周边功能在Spring的面向切面编程AOP思想里,即被定义为切面 ,AOP思想就是横向重复,纵向抽取 

 
在面向切面编程AOP的思想里面,核心业务功能和切面功能分别独立进行开发 
然后把切面功能和核心业务功能 "编织" 在一起,这就叫AOP  

AOP开发相关术语:

Joinpoint(连接点):所谓连接点就是指那些被拦截的点。在spring中,这些点指的是方法,因为spring只支持方法类型的连接点(可以被切入的点);

Pointcut(切入点):所谓切入点是指我们要对哪些Joinpoint进行拦截的定义(已经被切入的点)

Advice(通知/增强):所谓通知是指拦截到Joinpoint之后所要做的事情;通知分为、后置通知、异常通知、最终通知、环绕通知

Aspect(切面):是切入点和通知的结合

Target(目标对象):代理的目标对象过程。

Proxy(代理):一个类被AOP织入增强后,就产生一个结果代理类

Weaving(织入):是指把增强应用到目标对象来创建新的代理对象的;Spring采用动态代理织入,而AspectJ采用编译期织入和类装载期织入

首先准备一个业务类,也就是核心业务功能:

Spring AOP面向切面编程

 

Aspect(切面):通常是一个类,里面可以定义切入点和通知    例如这里的日志切面

对于通知的类型有:

2.通知类型介绍

(1)Before:在目标方法被调用之前做增强处理,@Before只需要指定切入点表达式即可

(2)AfterReturning:在目标方法正常完成后做增强,@AfterReturning除了指定切入点表达式后,还可以指定一个返回值形参名returning,代表目标方法的返回值

(3)AfterThrowing:主要用来处理程序中未处理的异常,@AfterThrowing除了指定切入点表达式后,还可以指定一个throwing的返回值形参名,可以通过该形参名

来访问目标方法中所抛出的异常对象

(4)After:在目标方法完成之后做增强,无论目标方法时候成功完成。@After可以指定一个切入点表达式

(5)Around:环绕通知,在目标方法完成前后做增强处理,环绕通知是最重要的通知类型,像事务,日志等都是环绕通知,注意编程中核心是一个ProceedingJoinPoint

Spring AOP面向切面编程

Object object = joinPoint.proceed();就是将来与某个核心功能编织之后,用于执行核心功能的代码

做环绕通知的时候,调用ProceedingJoinPoint的proceed()方法才会执行目标方法。

环绕通知:目标方法调用前后执行的代码,可以在方法调用前后完成自定义的行为。
       包围一个连接点(join point)的通知。它会在切入点方法执行前执行同时方法结束也会执行对应的部分。
       主要是调用proceed()方法来执行切入点方法,来作为环绕通知前后方法的分水岭。
       
      环绕通知类似于动态代理的全过程:ProceedingJoinPoint类型的参数可以决定是否执行目标方法。
       而且环绕通知必须有返回值,返回值即为目标方法的返回值

然后配置applicationContext.xml

Spring AOP面向切面编程

 

Spring AOP支持的切入点指示符:

<aop:pointcut ... />这一句是声明切入点,切入点的 id 叫 loggerCutPoint ,用来标记这个切入点,

这个expression表示:满足expression中的方法调用之后,就会去进行切面操作,类似于触发了切面

(1)execution:用来匹配执行方法的连接点

* 返回任意类型
com.spring.demo.ProductService.*  表示包名以 com.spring.demo.ProductService 开头的类的任意方法
(..) 参数是任意数量和类型

只要ProductService类中的任意的函数被调用,无论返回值是什么,都会去执行切面也就是<aop:aspect>...</aop:aspect>

而这里就是定义了一个切面,说白了就是一个类中的方法

 

Spring AOP面向切面编程