Spring AOP面向切面编程
首先,在面向切面编程的思想里面,把功能分为核心业务功能,和周边功能。
所谓的核心业务,比如登陆,增加数据,删除数据都叫核心业务
所谓的周边功能,比如性能统计,日志,事务管理等等
周边功能在Spring的面向切面编程AOP思想里,即被定义为切面 ,AOP思想就是横向重复,纵向抽取
在面向切面编程AOP的思想里面,核心业务功能和切面功能分别独立进行开发
然后把切面功能和核心业务功能 "编织" 在一起,这就叫AOP
AOP开发相关术语:
Joinpoint(连接点):所谓连接点就是指那些被拦截的点。在spring中,这些点指的是方法,因为spring只支持方法类型的连接点(可以被切入的点);
Pointcut(切入点):所谓切入点是指我们要对哪些Joinpoint进行拦截的定义(已经被切入的点)
Advice(通知/增强):所谓通知是指拦截到Joinpoint之后所要做的事情;通知分为、后置通知、异常通知、最终通知、环绕通知
Aspect(切面):是切入点和通知的结合
Target(目标对象):代理的目标对象过程。
Proxy(代理):一个类被AOP织入增强后,就产生一个结果代理类
Weaving(织入):是指把增强应用到目标对象来创建新的代理对象的;Spring采用动态代理织入,而AspectJ采用编译期织入和类装载期织入
首先准备一个业务类,也就是核心业务功能:
Aspect(切面):通常是一个类,里面可以定义切入点和通知 例如这里的日志切面:
对于通知的类型有:
2.通知类型介绍
(1)Before:在目标方法被调用之前做增强处理,@Before只需要指定切入点表达式即可
(2)AfterReturning:在目标方法正常完成后做增强,@AfterReturning除了指定切入点表达式后,还可以指定一个返回值形参名returning,代表目标方法的返回值
(3)AfterThrowing:主要用来处理程序中未处理的异常,@AfterThrowing除了指定切入点表达式后,还可以指定一个throwing的返回值形参名,可以通过该形参名
来访问目标方法中所抛出的异常对象
(4)After:在目标方法完成之后做增强,无论目标方法时候成功完成。@After可以指定一个切入点表达式
(5)Around:环绕通知,在目标方法完成前后做增强处理,环绕通知是最重要的通知类型,像事务,日志等都是环绕通知,注意编程中核心是一个ProceedingJoinPoint
Object object = joinPoint.proceed();就是将来与某个核心功能编织之后,用于执行核心功能的代码
做环绕通知的时候,调用ProceedingJoinPoint的proceed()方法才会执行目标方法。
环绕通知:目标方法调用前后执行的代码,可以在方法调用前后完成自定义的行为。
包围一个连接点(join point)的通知。它会在切入点方法执行前执行同时方法结束也会执行对应的部分。
主要是调用proceed()方法来执行切入点方法,来作为环绕通知前后方法的分水岭。
环绕通知类似于动态代理的全过程:ProceedingJoinPoint类型的参数可以决定是否执行目标方法。
而且环绕通知必须有返回值,返回值即为目标方法的返回值
然后配置applicationContext.xml
Spring AOP支持的切入点指示符:
<aop:pointcut ... />这一句是声明切入点,切入点的 id 叫 loggerCutPoint ,用来标记这个切入点,
这个expression表示:满足expression中的方法调用之后,就会去进行切面操作,类似于触发了切面
(1)execution:用来匹配执行方法的连接点
* 返回任意类型
com.spring.demo.ProductService.* 表示包名以 com.spring.demo.ProductService 开头的类的任意方法
(..) 参数是任意数量和类型
只要ProductService类中的任意的函数被调用,无论返回值是什么,都会去执行切面也就是<aop:aspect>...</aop:aspect>
而这里就是定义了一个切面,说白了就是一个类中的方法