首先导入aop的包和相关依赖包
在配置文件中创建增强方法的bean,随后配置aop的相关内容
<bean id="userService" class="com.aop.service.UserServiceImpl"></bean>
<bean id="logger" class="com.aop.logger.LoggerTest"></bean>
<aop:config>
<!--配置切入点表达式-->
<aop:pointcut expression="execution(* *..*.*(..))" id="log"></aop:pointcut>
<!--配置切面-->
<aop:aspect id="logAop" ref="logger">
<!--前置通知-->
<aop:before method="beforePrintLog" pointcut-ref="log"></aop:before>
<!--后置通知-->
<aop:after-returning method="afterReturingPrintLog" pointcut-ref="log"></aop:after-returning>
<!--异常通知-->
<aop:after-throwing method="afterThrowingPrintLog" pointcut-ref="log"></aop:after-throwing>
<!--最终通知-->
<aop:after method="afterPrintLog" pointcut-ref="log"></aop:after>
</aop:aspect>
</aop:config>
配置切入点表达式时,表达式一定要加execution() 全通配表达式* *..*.*(..)
下面的是相关类的代码
// 前置通知
public void beforePrintLog() {
System.out.println("前置通知beforePrintLog执行了");
}
// 后置通知
public void afterReturingPrintLog() {
System.out.println("后置通知afterReturingPrintLog执行了");
}
// 异常通知
public void afterThrowingPrintLog() {
System.out.println("异常通知afterThrowingPrintLog执行了");
}
// 最终通知
public void afterPrintLog() {
System.out.println("最终通知afterPrintLog执行了");
}
此处根据你是否要测试异常来选择注释掉 int = 1/0;
@Override
public void findAllUser() {
int i = 1/0;
System.out.println("执行了查询操作");
}
环绕通知比较特殊,不能像之前其他通知一样配置,以下配置会导致切入点方法不执行
public Object aroundPrintLog() {
System.out.println("环绕通知aroundPrintLog执行了");
return null;
<aop:around method="aroundPrintLog" pointcut-ref="log"></aop:around>
由动态代理可知,环绕通知就是invoke方法,但环绕通知里没有明确的切入点方法调用
解决:使用Spring提供的ProceedingJoinPoint,该接口可以作为环绕通知方法的参数使用
该接口有一个方法proceed(),此方法等同于method.invoke(),就是明确调用切入点方法
public Object aroundPrintLog(ProceedingJoinPoint pjp) {
Object result = null;
try {
System.out.println("前置通知执行了==========");
result = pjp.proceed();
System.out.println("后置通知执行了==========");
} catch (Throwable e) {
System.out.println("异常通知执行了==========");
e.printStackTrace();
}finally {
System.out.println("最终通知执行了==========");
}
return result;
}
此文章为我个人的学习笔记总结,自用