SpringAOP配置要点
一、基于配置文件
1、关于aop配置文件相关
<!--配置aop--> <aop:config> <!--配置切入点表达式--> <aop:pointcut id="aspect_method" expression="execution(* service.Impl.AccountServiceImpl.save())"></aop:pointcut> <!--配置aop切面--> <aop:aspect id="logAdvice" ref="log"> <!--配置通知类型,并建立通知方法和切入点方法的关联--> <!--配置前置通知 在切入点方法执行之前执行--> <aop:before method="beforeAdvice" pointcut-ref="aspect_method"></aop:before> <!--配置后置通知 在切入点方法执行之后且不发生异常执行--> <aop:after-returning method="afterReturnAdvice" pointcut-ref="aspect_method"></aop:after-returning> <!--配置异常通知 在切入点方法发生异常时执行,此时不会执行异常通知--> <aop:after-throwing method="afterThrowsAdvice" pointcut-ref="aspect_method"></aop:after-throwing> <!--配置最终通知 不管切入点方法是否发生异常都会执行--> <aop:after method="afterAdvice" pointcut-ref="aspect_method"></aop:after> <!--配置环绕通知--> <aop:around method="aroundLog" pointcut-ref="aspect_method"></aop:around> </aop:aspect> </aop:config>
2、切面类模板范例
package utils; import org.aspectj.lang.ProceedingJoinPoint; /** * @Classname Logger * @Description TODO * @Date 2020/9/21 15:23 * @Created by Administrator */ public class Logger { public void beforeAdvice() { System.out.println("前置通知记录日志..."); } public void afterReturnAdvice() { System.out.println("后置通知记录日志..."); } public void afterThrowsAdvice() { System.out.println("异常通知记录日志..."); } public void afterAdvice() { System.out.println("最终通知记录日志..."); } public Object aroundLog(ProceedingJoinPoint pjp){ Object rtValue=null; try { Object[] args = pjp.getArgs(); System.out.println("前置通知记录日志..."); rtValue = pjp.proceed(args); System.out.println("后置通知记录日志..."); return rtValue; } catch (Throwable throwable) { System.out.println("异常通知记录日志..."); throwable.printStackTrace(); }finally { System.out.println("最终通知记录日志..."); } return rtValue; } }
3、切入点表达式写法
切入点表达式的写法:
1、标准写法
权限修饰符 返回值类型 包名.包名.包名..包名.类名.方法名(参数)
eg:public void service.Impl.AccountServiceImpl.save()
2、省略权限修饰符
返回值类型 包名.包名.包名..包名.类名.方法名(参数)
eg:void service.Impl.AccountServiceImpl.save()
3、返回值可使用通配符代替,表示任意类型
* 包名.包名.包名..包名.类名.方法名(参数)
eg:* service.Impl.AccountServiceImpl.save()
4、包名可使用通配符表示任意包名
1)* *.*.*.*.类名.方法名(参数)
2)* *..*.类名.方法名(参数)
5、参数列表
基本类型直接写名称 int
引用类型写包名.类名形式 java.lang.String
使用通配符*表示有参数
使用..表示有无参数均可
6、全通配
* *..*.*.*(..)
二、基于注解配置
1、配置类
package sun.config; import org.aspectj.lang.annotation.Aspect; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.EnableAspectJAutoProxy; /** * @Classname SpringConfig * @Description TODO * @Date 2020/9/21 16:55 * @Created by Administrator */ @Configuration @EnableAspectJAutoProxy @ComponentScan(basePackages = "sun") public class SpringConfig { }
2、切面类注解范例
package sun.utils; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.*; import org.springframework.stereotype.Component; /** * @Classname Logger * @Description TODO * @Date 2020/9/21 15:23 * @Created by Administrator */ @Component("log") @Aspect public class Logger { @Pointcut("execution(* sun.service.Impl.AccountServiceImpl.save())") private void aspect_method() { } // @Before("aspect_method()") public void beforeAdvice() { System.out.println("前置通知记录日志..."); } // @AfterReturning("aspect_method()") public void afterReturnAdvice() { System.out.println("后置通知记录日志..."); } // @AfterThrowing("aspect_method()") public void afterThrowsAdvice() { System.out.println("异常通知记录日志..."); } // @After("aspect_method()") public void afterAdvice() { System.out.println("最终通知记录日志..."); } @Around("aspect_method()") public Object aroundLog(ProceedingJoinPoint pjp) { Object rtValue = null; try { Object[] args = pjp.getArgs(); System.out.println("前置通知记录日志..."); rtValue = pjp.proceed(args); System.out.println("后置通知记录日志..."); return rtValue; } catch (Throwable throwable) { System.out.println("异常通知记录日志..."); throwable.printStackTrace(); } finally { System.out.println("最终通知记录日志..."); } return rtValue; } }