<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);
}
希望对你有帮助..