关于spring aop针对spring mvc的@RequestMapping方法切面的方法没有执行的解决方案

2022-07-01 13:57:55

一、问题的现象

1、使用Spring MVC,创建Controller类和@RequestMapping方法

@Controller@RequestMapping("/product")publicclassProductController{@AutowiredProductServiceImpl productService;@RequestMapping("/findAll.do")publicModelAndViewfindAll(@RequestParam(name="pageNum")Integer pageNum,@RequestParam(name="pageSize")Integer pageSize)throwsMyException{System.out.println("执行findall......");

2、使用spring AOP切面Controller类中的方法

@Component("agentController")@AspectpublicclassAgentController{privateDate visitTime;privateDate endTime;privateint executionTime;//执行时长privateClass clazz;//执行的类privateMethod method;//执行的方法privateSysLog sysLog=newSysLog();@Pointcut("execution(* com.mediacomm.controller.*.*(..))")publicvoidservice(){}@AutowiredprivateSysLogService sysLogService;@AutowiredprivateHttpServletRequest request;@Before("service()")publicvoidbeforeAdvice(JoinPoint pro)throwsNoSuchMethodException,ParseException{System.out.println("前置通知......"+sysLog.getId());

3、依靠idea查看前置通知方法切面的目标,是代理成功的
在这里插入图片描述
4、但是实际情况执行起来前置通知根本没有切入,控制台没有打印出:前置通知…

二、解决方案

原因:
1、我是基于注解的方式配置的aop,所以在spring的配置文件中需要加入<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
的开启声明
2、但是我在spring的配置文件中又添加了注解扫描忽略

<context:component-scanbase-package="com.mediacomm"><context:exclude-filtertype="annotation"expression="org.springframework.stereotype.Controller"/></context:component-scan>

3、因此在spring的容器中并没有Controller类的bean
4、所以导致aop切入点没有找到对应的方法
解决方法:
将<aop:aspectj-autoproxy></aop:aspectj-autoproxy>配置在负责扫描@Controller注解的springmvc的配置文件中,重新运行后控制台输出:

前置通知......null

结论:
需要根据你的切面方法的目标对象的所创建bean实体的配置文件来添加<aop:aspectj-autoproxy></aop:aspectj-autoproxy>

  • 作者:SISD
  • 原文链接:https://blog.csdn.net/weixin_42717117/article/details/119759182
    更新时间:2022-07-01 13:57:55