所谓定义切点,其实质就是为一个切入点表达式起一个名称,从而允许在多个增强处理中重用该名称。下面定义一个切入点。
@Aspect
public class SystemArchitecture
{
@Pointcut("execution(* com.owenapp.service.impl.*.*(..))")
public void myPointcut(){}
}
下面的切面类中将直接使用上面定义的myPointcut()切入点。
@Aspect
public class LogAspect
{
// 直接使用SystemArchitecture切面类的myPointcut()切入点
@AfterReturning(returning="rvt"
, pointcut="SystemArchitecture.myPointcut()")
// 声明rvt时指定的类型会限制目标方法必须返回指定类型的值或没有返回值
// 此处将rvt的类型声明为Object,意味着对目标方法的返回值不加限制
public void log(Object rvt)
{
System.out.println("获取目标方法返回值:" + rvt);
System.out.println("模拟记录日志功能...");
}
}
正如上面所看到的LogAspect.java中,该类可以直接使用SystemArchitecture类中定义的切点,这意味着其它切面类也可以自由使用SystemArchitecture类中定义的切点,这就很好地复用了切点所包含的切点表达式。