1. 切入点,其实质就是为一个切入点表达式起一个名称,从而允许在多个增强处理中重用该名称。一个切入点表达式:用于指定切入点和哪些方法进行匹配,一个包含名字和任意参数的方法签名:将作为切入点的名称, 在@AspectJ风格的AOP中,切入点签名采用一个普通的方法定义(方法体通常为空)来提供(方法名即为切点名),且该方法的返回值必须为void,切入点表达式需使用@Pointcut注解来标注。下面的代码片段定义了一个切入点。
//定义切点,注解作为切入点(常用自定义注解)
@Pointcut("@annotation(com.qcby.demo.proxyaop.aop.ViewRecords)")
//com.qcby.demo.proxyaop.aop.ViewRecords注解路径
public void viewRecordsPoinCut() {
}
或者
//定义切点,对应路径作为切入点
@Pointcut("execution(public * com.qcby.demo.proxyaop.controller..*.*(..))")
//public * com.qcby.demo.proxyaop.controller..*.*(..))第一个* 代表返回值,第二个*
//代表类,第三个*代表方法名,(..)代表入参
public void viewRecordsPoinCut() {
}
2访问目标方法最简单的做法是定义增强处理方法时,将第一个参数定义为JoinPoint类型,当该增强处理方法被调用时,该JoinPoint参数就代表了织入增强处理的连接点。JoinPoint里包含了如下几个常用的方法:
Object[] getArgs:返回目标方法的参数
Signature getSignature:返回目标方法的签名
Object getTarget:返回被织入增强处理的目标对象
Object getThis:返回AOP框架为目标对象生成的代理对象
注意:当使用@Around处理时,我们需要将第一个参数定义为ProceedingJoinPoint类型,该类是JoinPoint的子类。
ProceedingJoinPoint对象是JoinPoint的子接口,该对象只用在@Around的切面方法中,
添加了 Object proceed() throws Throwable //执行目标方法
Object proceed(Object[] var1) throws Throwable //传入的新的参数去执行目标方法
3.
前置通知(Before Advice)
在某连接点(JoinPoint)之前执行的通知,但这个通知不能阻止连接点前的执行。例如,TestAspect 中的 doBefore 方法。
后置通知(After Advice)
当某连接点退出的时候执行的通知(不论是正常返回还是异常退出)。
例如,ServiceAspect 中的 returnAfter 方法,所以 Teser 中调用 UserService.delete 抛出异常时,returnAfter 方法仍然执行。
返回后通知(After Return Advice)
在某连接点正常完成后执行的通知,不包括抛出异常的情况。
环绕通知(Around Advice)
包围一个连接点的通知,类似 Web 中 Servlet 规范中的 Filter 的 doFilter 方法。可 以在方法的调用前后完成自定义的行为, 也可以选择不执行。
例如,ServiceAspect 中的 around 方法。
异常通知(After Throwing Advice)
在 方 法 抛 出 异 常 退 出 时 执 行 的 通 知 。
//这样定义
@After("viewRecordsPoinCut()")
//切入点定义的viewRecordsPoinCut()
public void after(JoinPoint joinPoint) throws Throwable {
}
本文介绍了AOP(切面编程)的基础知识,包括切入点的概念,它允许通过名称重用切入点表达式。切入点表达式是匹配方法的规则,可以使用@Pointcut注解定义。此外,文章详细讲解了不同类型的增强处理方法,如前置通知、后置通知、返回后通知、环绕通知和异常通知,解释了它们在连接点执行时的不同行为。
1528

被折叠的 条评论
为什么被折叠?



