Spring注解配置AOP导致通知执行顺序紊乱解决方案
#代码知识 发布时间: 2026-01-12
今天在测试Spring的AOP时,发现使用注解配置AOP的方式会导致通知的执行顺序紊乱。【最终通知居然在异常通知之前执行了】
测试代码
(1)定义TargetInterface目标接口
public interface TargetInterface {
public abstract void targetProxy();
}
(2)定义TargetImpl目标类
@Component("target")
public class TargetImpl implements TargetInterface {
public void targetProxy() {
System.out.println("target proxy ......");
int i = 1/0;//异常
}
}
(3)定义切面类(内含增强方法)
@Component("myAspect")//定义切面类
@Aspect//声明当前类是切面类
public class TargetAspect {
//定义切点表达式
@Pointcut("execution(* com.ahzyy.target.impl.*.*(..))")
public void pt() {
}
@Before("pt()")
public void before() {
System.out.println("前置通知......");
}
@After("pt()")
public void after() {
System.out.println("最终通知......");
}
@AfterReturning("pt()")
public void afterReturning() {
System.out.println("后置通知......");
}
@AfterThrowing("pt()")
public void afterThrowing() {
System.out.println("异常通知......");
}
}
(4)配置applicationContextAnno.xml文件
<!--配置组件扫描的包--> <context:component-scan base-package="com.ahzyy"/> <!--配置AOP自动代理--> <aop:aspectj-autoproxy/>
(5)定义测试类
@RunWith(SpringJUnit4ClassRunner.class)
//@ContextConfiguration("classpath:applicationContext.xml")
@ContextConfiguration("classpath:applicationContextAnno.xml")
public class AopTest {
@Autowired
private TargetInterface target;
@Test
public void test01() {
target.targetProxy();
}
}
(6)运行结果:
【最终通知在异常通知之前执行了!!!】
(7)解决方法:
(7.1)使用xml配置方式配置AOP;
(7.2)注解使用@Around(环绕通知)方式配置AOP(修改TargetAspect类使用环绕通知);
@Component("myAspect")//定义切面类
@Aspect//声明当前类是切面类
public class TargetAspect {
//定义切点表达式
@Pointcut("execution(* com.ahzyy.target.impl.*.*(..))")
public void pt() {
}
@Around("pt()")
public Object aroundNotice(ProceedingJoinPoint pjp) {
System.out.println("环绕通知");
Object result = null;
before();//前置通知
try {
result = pjp.proceed();
afterReturning();//后置通知
} catch (Throwable throwable) {
afterThrowing();//异常通知
throwable.printStackTrace();
}
after();//最终通知
return result;
}
public void before() {
System.out.println("前置通知......");
}
public void afterReturning() {
System.out.println("后置通知......");
}
public void afterThrowing() {
System.out.println("异常通知......");
}
public void after() {
System.out.println("最终通知......");
}
}
(7.3)运行结果
[运行顺序正确]
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
代码知识SEO上一篇 : mysql 主从复制如何跳过报错
下一篇 : 关于提交项目到gitee报错Push to origin/master was rejected的问题
-
SEO外包最佳选择国内专业的白帽SEO机构,熟知搜索算法,各行业企业站优化策略!
SEO公司
-
可定制SEO优化套餐基于整站优化与品牌搜索展现,定制个性化营销推广方案!
SEO套餐
-
SEO入门教程多年积累SEO实战案例,从新手到专家,从入门到精通,海量的SEO学习资料!
SEO教程
-
SEO项目资源高质量SEO项目资源,稀缺性外链,优质文案代写,老域名提权,云主机相关配置折扣!
SEO资源
-
SEO快速建站快速搭建符合搜索引擎友好的企业网站,协助备案,域名选择,服务器配置等相关服务!
SEO建站
-
快速搜索引擎优化建议没有任何SEO机构,可以承诺搜索引擎排名的具体位置,如果有,那么请您多注意!专业的SEO机构,一般情况下只能确保目标关键词进入到首页或者前几页,如果您有相关问题,欢迎咨询!