1.<!--配置自定义扫描包-->
<context:component-scan base-package="com.company.aop.log"/>
2.<!--开启基于注解的AOP功能 -->
<aop:aspectj-autoproxy/>
3.<!--声明一个切面类,并将切面类加入到IOC容器中 -->
@Aspect //定义一个切面类
@Component //将切面类加入到IOC容器中
public class LogAspect {
//execution([权限修饰符] [返回值类型] [简单类名/全类名] [方法名]([参数列表]))
@Pointcut(value="execution(public * com.company.aop.log.*.*(..))")
public void pointCutExpression(){}//定义切入点表达式
//定义通知方法
@Before(value="pointCutExpression()")
public void before(JoinPoint joinPoint){
//得到方法签名 com.company.aop.log.LogAspect.before(JoinPoint)
Signature signature = joinPoint.getSignature();
//得到方法名
String methodName = signature.getName();
//得到参数列表
Object[] args = joinPoint.getArgs();
List argsList = Arrays.asList(args);
System.out.println("[AOP日志]["+methodName+"方法开始][参数值"+argsList+"]");
}
@AfterReturning(value="pointCutExpression()",returning="result")
public void afterReturning(JoinPoint joinPoint,Object result){
//得到方法签名 com.company.aop.log.LogAspect.before(JoinPoint)
Signature signature = joinPoint.getSignature();
//得到方法名
String methodName = signature.getName();
//得到参数列表
Object[] args = joinPoint.getArgs();
List argsList = Arrays.asList(args);
System.out.println("[AOP日志]["+methodName+"方法返回][参数值:"+argsList+"][返回值:]"+result+"");
}
@AfterThrowing(value="pointCutExpression()",throwing="throwable")
public void afterThrowing(JoinPoint joinPoint,Throwable throwable){
//得到方法签名 com.company.aop.log.LogAspect.before(JoinPoint)
Signature signature = joinPoint.getSignature();
//得到方法名
String methodName = signature.getName();
//得到参数列表
Object[] args = joinPoint.getArgs();
List argsList = Arrays.asList(args);
System.out.println("[AOP日志]["+methodName+"方法返回][参数值:"+argsList+"][异常信息:]"+throwable+"");
}
@After(value="pointCutExpression()")
public void after(){
System.out.println("[AOP日志][方法结束]");
}
}
4.切面常用通知方法
4.1前置通知 @Before
4.2返回通知 @AfterReturning
4.3异常通知 @AfterThrowing
4.4后置通知 @After
4.5环绕通知 @Around