接口
public interface Calculator {
int add(int a,int b);
int sub(int a,int b);
int mul(int a,int b);
int div(int a,int b);
}
实现类
每个方法相当于一个切点
public class CalculatorImpl implements Calculator {
@Override
public int add(int a, int b) {
int result=a+b;
return result;
}
@Override
public int sub(int a, int b) {
int result=a-b;
return result;
}
@Override
public int mul(int a, int b) {
int result=a*b;
return result;
}
@Override
public int div(int a, int b) {
int result=a/b;
return result;
}
}
通知
环绕通知与前面的通知,只能用一种方式
@Component
@Aspect
@Order(3)
public class LogAspect{
//声明一个共用的切点表达式
@Pointcut("execution(public int com.cdsxt.spring.aop.CalculatorImpl.*(int,int))")
public void point() {}
//切点表达式
//语法: execution(修饰符 返回类型 包名.类名.方法名(形参列表))
@Before("point()")
public void beforeLog(JoinPoint jp) {
//获取方法名
String methodName=jp.getSignature().getName();
//获取实参列表
Object[] args=jp.getArgs();
System.out.println("the method "+methodName+" begin with "+Arrays.toString(args));
}
@After("point()")
public void afterLog(JoinPoint jp) {
//获取方法名
String methodName=jp.getSignature().getName();
System.out.println("the method "+methodName+" end");
}
@AfterThrowing(value="point()",throwing="e")
public void exceptionLog(Exception e) {
System.out.println("the method is error with "+e);
}
@AfterReturning(value="point()",returning="result")
public void returnLog(Object result) {
System.out.println("the method return "+result);
}
/*@Around("point()")
public Object aroundLog(ProceedingJoinPoint pjp) {
Object result=null;
try {
System.out.println("前置通知");
//调用被代理的方法
result=pjp.proceed();
System.out.println("后置通知");
} catch (Throwable e) {
System.out.println("异常通知");
e.printStackTrace();
}
System.out.println("返回通知");
return result;
}*/
XML配置
<!-- 扫描注入spring管理的bean -->
<context:component-scan base-package="com.cdsxt.spring.aop"></context:component-scan>
<!-- 使切面自动生成代理对象 -->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>