切入点
- 定义要拦截哪些类的哪些方法
- 匹配规则,拦截什么方法
- 定义切入点 @Pointcut(“execution(*匹配规则”)
- Aop切入点表达式
表达式中的第一个* 代表方法的修饰范围 (public 、private、protected)
如果取值是*,则表示所有范围
执行所有的方法 execution(public *(..))
执行任意的set方法 execution(* set*(..))
执行指定包下的任意类的任意方法 execution(* com.xxx.service.*.*(..))
执行指定包及子包下的任意类的任意方法 execution(* com.xxx.service..*.*(..))
代码案例
切面类
@Component @Aspect //声明当前类是一个切面 public class LogCut { //切入点 @Pointcut("execution(* com.aop.service..*.*(..))") public void cut(){} //声明前置通知 @Before(value = "cut()") public void before(){ System.out.println("前置通知..."); } //声明返回通知 没有异常的情况下执行 @AfterReturning(value = "cut()") public void afterReturn(){ System.out.println("返回通知..."); } //声明最终通知 无论是否有异常,都会执行 @After(value = "cut()") public void after(){ System.out.println("最终通知..."); } //异常通知 @AfterThrowing(value = "cut()") public void afterThrowing(){ System.out.println("异常通知..."); } //环绕通知 @Around(value = "cut()") public Object around(ProceedingJoinPoint pjp){ Object obj = null; try { obj = pjp.proceed(); } catch (Throwable throwable) { throwable.printStackTrace(); } System.out.println("环绕通知..."); return obj; } }
xml文件配置
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <!--开启注解扫描--> <context:component-scan base-package="com.aop"/> <!--开启aop注解代理--> <aop:aspectj-autoproxy/> </beans>