spring mvc aop对controller切面编程无效解决

位置:首页>文章>详情   分类: 教程分享 > Java教程   阅读(2223)   2023-03-28 11:29:14

引言

    在初步使用Spring MVC框架中使用切面的时候可能会遇到AOP对controller层切面无效。这其实是spring容器的原因。下面将详细讲解。切面配置没有问题的情况下,junit单元测试调用controller里面的方法,可以触发切点,实现切面编程。但是web部署到tomcat后,直接url访问触发切点失败!


问题起因

经查看,项目中有两个配置文件。
  • spring-mvc.xml
  • applicationContext.xml 
applicationContext.xml 部分代码:
<!-- 自动扫描项目下面的包 ,将带有注解的类 纳入spring容器管理   扫描service、dao -->
<context:component-scan base-package="com.test"></context:component-scan>
<!-- 配置使Spring采用CGLIB代理 -->
<aop:aspectj-autoproxy proxy-target-class="true" />
spring-mvc.xml配置代码:
<!-- 默认的注解映射的支持 -->
<mvc:annotation-driven />

<!-- 自动扫描该包,使SpringMVC认为包下用了@controller注解的类是控制器 -->
<context:component-scan base-package="com.test.controller" />

其实通过上一篇转载的Spring Context 与Spring MVC Context 博客中可以知道,spring 和spring mvc是两个容器,且spring mvc是spring的子容器。上面的启用代理的配置在父级spring容器中,由于spring 容器中,子容器可以访问父级容器资源但是父级容器无法访问子容器。所以导致了controller的AOP无效.

解决办法:


将以下配置AOP注解启用代理的片段代码移入spring-mvc.xml配置文件中,这样AOP就可以代理两个容器所有资源。
<!-- 配置使Spring采用CGLIB代理 -->
<aop:aspectj-autoproxy proxy-target-class="true" />
地址:https://www.leftso.com/article/308.html

相关阅读

Spring AOP来由,为何会出现Spring AOP这样的框架? 上一篇从Web开发演进过程的一个侧面简述了一下为什么会有Spring框架?事实上只介绍了为什么会有Spring IOC(控制...
spring mvc aop对controller切面编程无效解决,在初步使用Spring MVC框架中使用切面的时候可能会遇到AOP对controller层切面无效。这其实是spring容器的...
Spring AOP 实现原理基础讲解
Spring Boot 入门 AOP 日志处理,这里主要讲解spring boot 中采用AOP方式进行日志的统一处理。spring 框架的处理也是一样。综合来讲,本文主要讲解了spring b...
Spring框架每个版本的特性及历史介绍,从Spring框架开始1.0到最新的Spring 5.0进行讲解整个Spring生涯中的演变过程以及spring框架生态的扩展。
java编程中spring框架5.0介绍说明/概述,spring5,spring框架,java编程
Spring框架Spring IoC容器的核心原理,前三篇已经从历史的角度和大家一起探讨了为什么会有Spring,Spring的两个核心概念:IoC和AOP的雏形,Spring的历史变迁和如今的...
简述由于Spring切面粒度最小是达到方法级别,而execution表达式可以用于明确指定方法返回类型,类名,方法名和参数名等与方法相关的部件,并且在Spring中,大部分需要使用AOP的业务场...
Spring框架中注解@PostConastruct 和 @PreDestroy来实现Bean初始化和销毁时候执行方法
Spring框架中,可以在6个内置的Scope中创建bean,也可以定义自定义范围。 在这六个范围中,只有在使用Web感知的ApplicationContext时才有四个范围可用。singlet...