一.第一种写法
1.先定义一个类
package com.spring.aop;
public class Service {
public void m1() {
System.out.println("我是 m1 方法");
}
public void m2() {
System.out.println(1 / 0);
System.out.println("我是 m2 方法");
}
}
2.定义一个切面类(第一种)
package com.javacode2018.aop.demo9.test1;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
//这个类需要使用@Aspect进行标注,标注该类为切面类
@Aspect
public class Aspect {
//定义了一个切入点,可以匹配Service中所有方法
@Pointcut("execution(* com.spring.aop.Service.*(..))")
public void pointcut() {
}
//定义了一个前置通知,这个通知对刚刚上面我们定义的切入点中的所有方法有效
@Before(pointcut = "pointcut1()")
public void before(JoinPoint joinPoint) {
//输出连接点的信息
System.out.println("前置通知," + joinPoint);
}
//定义了一个异常通知,这个通知对刚刚上面我们定义的切入点中的所有方法有效
@AfterThrowing(pointcut = "pointcut1()", throwing = "e")
public void afterThrowing(JoinPoint joinPoint, Exception e) {
//发生异常之后输出异常信息
System.out.println(joinPoint + ",发生异常:" + e.getMessage());
}
}
二.第二种写法
1.先写注解接口。
package com.javacode2018.cache.ReloadCache
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Authorize {
String functionCode();
}
2.定义一个类
package com.spring.aop;
public class Service {
@RelodCache//这里标注自定义注解
public void m1() {
System.out.println("我是 m1 方法");
}
}
3.编写切面类
package com.javacode2018.aop.demo9.test1;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
//这个类需要使用@Aspect进行标注,标注该类为切面类
@Aspect
public class Aspect {
//定义了一个切入点,匹配所有标注ReloadCache注解的方法
@Pointcut("@annotation(com.javacode2018.cache.ReloadCache)")
public void pointcut() {
}
//定义了一个前置通知,这个通知对刚刚上面我们定义的切入点中的所有方法有效
@Before(pointcut = "pointcut1()")
public void before(JoinPoint joinPoint) {
//输出连接点的信息
System.out.println("前置通知," + joinPoint);
}
//定义了一个异常通知,这个通知对刚刚上面我们定义的切入点中的所有方法有效
@AfterThrowing(pointcut = "pointcut1()", throwing = "e")
public void afterThrowing(JoinPoint joinPoint, Exception e) {
//发生异常之后输出异常信息
System.out.println(joinPoint + ",发生异常:" + e.getMessage());
}
}
三.注:通知有五种,这里只举例两种通知,还有
后置通知:@AfterReturn,在连接点正常执行完成后执行,如果连接点抛出异常,则不会执行
最终通知:@After,在连接点执行完成后执行,不管是正常执行完成,还是抛出异常,都会 执行返回通知中的内容
环绕通知:@Around,环绕通知围绕在连接点前后,比如一个方法调用的前后。这是最强大 的通知类型,能在方法调用前后自定义一些操作。环绕通知还需要负责决定是继 续处理join point(调用ProceedingJoinPoint的proceed方法)还是中断执行。
四.JoinPoint对象:封装了SpringAop中切面方法的信息
常用api:
| 方法名 | 功能 |
|---|---|
| Signature getSignature(); | 获取封装了署名信息的对象,在该对象中可以获取到目标方法名,所属类的Class等信息 |
| Object[] getArgs(); | 获取传入目标方法的参数对象 |
| Object getTarget(); | 获取被代理的对象 |
| Object getThis(); | 获取代理对象 |



