spring+springmvc添加aop不执行的解决方法

本文介绍 Spring AOP 的实现方式,包括如何正确配置 @AspectJ 支持及 @Pointcut 和 @After 注解的使用。同时,详细解释了如何通过 JoinPoint 或直接定义参数来获取切面方法中的参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<context-param>
	<param-name>contextConfigLocation</param-name>
	<param-value>
		classpath*:/applicationContext.xml
	</param-value>
</context-param>
<servlet>
	<servlet-name>springmvc</servlet-name>
	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
	<init-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath*:/applicationContext-mvc.xml</param-value>
	</init-param>
	<load-on-startup>1</load-on-startup>
</servlet>

 以上是web.xml配置

 applicationContext-mvc只扫描了@Controller注解

 applicationContext扫描了除@Controller以外的bean

 aop类如下:

 

@Component("orderNotifyAspect")
@Aspect
public class OrderNotifyAspect {

	@Pointcut("execution(* com.xxx.service.OrderService.fail(..))")//fail方法有个参数fail(String no)
	public void orderFail() {
		System.out.println("======aspect:orderFail加载======");
	}

	@After(value = "orderFail()")
	public void notifyOrderFail() {
		System.out.println("=======增强方法执行======");
	}
}
 然后在applicationContext-mvc中配置了<aop:aspectj-autoproxy/>,启动测试,@after方法不执行。

经过测试,最后把<aop:aspectj-autoproxy/>配置到applicationContext.xml中就可以了。

 注意:

1、@Aspect注解的类一定要配置成bean,而且被spring加载,才可以,即同时配置@Component和@Aspect;

2、如果配置了bean,要检索component-scan扫描范围是否包括Aspect类;

==================================================

更新:

获取切面方法的参数

void fail(String p1, String p2, String p3);//如果fail方法是这样定义

方法一:直接通过JoinPoint对象获取参数列表,Spring AOP提供使用org.aspectj.lang.JoinPoint类型获取连接点数据,任何通知方法的第一个参数都可以是JoinPoint(环绕通知是ProceedingJoinPoint,JoinPoint子类)
@After(value = "orderFail()")
public void notifyOrderFail(JoinPoint point) {
	System.out.println("=======增强方法执行======");
	for (Object o : point.getArgs()) {
		log.debug("" + o);
	}
}


方法二:通过定义参数列表获取

假如我们要获取前2个参数,重写pointcut如下:

@Pointcut(value = "execution(* com.xxxx.service.OrderService.fail(..)) && args(p1, p2, ..)")//一定要加上“,..”否则表示只匹配2个参数的fail方法,导致增强方法不执行
public void orderFail(String p1, String p2) {//这里同样要定义和上面args(p1,p2,..)对应的参数列表
	System.out.println("==============");
}


增强方法:

@After(value = "orderFail(p1, p2)")
public void notifyOrder(String p1, String p2) {
	log.debug("p1={}, p2={}", p1, p2);
}

希望对你有帮助..
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值