SpringMVC记录我遇到的坑_AOP注解无效,切面不执行的解决
作者:z781582206 发布时间:2021-08-09 06:20:58
标签:SpringMVC,AOP注解,切面
AOP注解无效,切面不执行的解决
想做一个api请求日志,想到使用aop,配置过程中遇到了一个坑,aop不起作用,
我的aop是这样的:
package com.ljwm.ibei.aspact;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
/**
* Created by user on 2017/9/8.
*/
@Aspect
@Configuration
public class ApiRequestLog {
private Logger _log = LoggerFactory.getLogger(ApiRequestLog.class);
@Around("execution(* com.ljwm.ibei.controller.*.*(..))")
public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
RequestAttributes ra = RequestContextHolder.getRequestAttributes();
ServletRequestAttributes sra = (ServletRequestAttributes) ra;
HttpServletRequest request = sra.getRequest();
String url = request.getRequestURL().toString();
String method = request.getMethod();
String uri = request.getRequestURI();
String queryString = request.getQueryString();
_log.debug("请求开始, 各个参数, url: {}, method: {}, uri: {}, params: {}", url, method, uri, queryString);
Object result = pjp.proceed();
return result;
}
}
配置文件分成applicationContext.xml、applicationContext-mvc.xml还有mybatis和shiro的
web.xml配置:
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<display-name>Archetype Created Web Application</display-name>
<filter>
<filter-name>shiroFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
<init-param>
<param-name>targetFilterLifecycle</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>shiroFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>spring-dispatcher</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/applicationContext-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring-dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/applicationContext*.xml</param-value>
</context-param>
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
<listener>
<listener-class>com.ljwm.ibei.listener.ContextFinalizer</listener-class>
</listener>
</web-app>
我把<aop:aspectj-autoproxy proxy-target-class="true"/>写在applicationContext中,把<context:component-scan> 和 <mvc:annotation-driven>写在applicationContext-mvc中,发现aop没有执行,后来经过尝试发现,因为在初始化DispatchServlet的时候加载了mvc的配置,但是aop的代理却没有加载,导致其不能执行,我猜测是因为spring默认bean是单例的,
对已经初始化的bean容器不在做后续处理,由于是先加载的mvc所以是aop失效,我把aop代理的那个放到mvc中,aop就能执行了,不知道我的猜测对不对,还望大神赐教
另一个问题:
springmvc在controller层使用aop切面不成功解决
需要在配置文件中加入
<aop:aspectj-autoproxy proxy-target-class="true" />
来源:https://blog.csdn.net/z781582206/article/details/77894774


猜你喜欢
- 前言大家应该都遇到过,在工作和生活中经常要填写一些个人资料,这时候往往需要放证件照上去,但是有时候人家要求是红底或白底,但是偏偏不巧的是你以
- 1.准备工作首先实现识别数字等字符,我们要知道需要采用OCR (Optical Character Recognition,光学字符识别)来
- 建立Android项目,如果会的话特别简单,不会的话让自己去琢磨也需要一定的时间!小编之后将自己学习Android的经验给大家分享出来!1、
- 背景SpringBoot 版本<parent> <groupId>org.springfr
- 前言目前Google已经发布了Android13的正式版,虽然国内的手机能用上Android13还有一段时间,不过开发者们可以通过模拟器来体
- java 判断两个对象是否为同一个对象用“==”比较的是引用的地址,用equals比较的就是值。那我们new两个相同的对象什么属性都一样,为
- 如下所示:package cn.jdk.foreach;import java.util.HashMap;import java.util.
- 前言当您使用LINQ来处理数据库时,这种体验是一种神奇的体验,对吗?你把数据库实体像一个普通的收集,使用Linq中像Where,Select
- 一、构造方法概述构造方法是一种特殊的方法作用:创建对象Student stu = new Student();格式:pucli class
- 本文实例为大家分享了Android实现页面滑动切换动画的具体代码,供大家参考,具体内容如下实现两个页面滑动切换,一些相册的效果也是如此一个A
- 详解path和classpath的区别path的作用path是系统用来指定可执行文件的完整路径,即使不在path中设置JDK的路径也可执行J
- 简介项目需要...直接展示效果吧:原理使用UGUI提供的ScrollRect和ScrollBar组件实现基本滑动以及自己控制每次移动一页来达
- 前言最近在阅读 .NET Threadpool starvation, and how queuing makes it worse 这篇博
- 本文实例讲述了C#自定义控件实现TextBox禁止粘贴的方法。分享给大家供大家参考,具体如下:开发环境:Visual Studio .net
- 背包问题主要是指一个给定容量的背包、若干具有一定价值和重量的物品,如何选择物品放入背包使物品的价值最大。其中又分01背包和无限背包,这里主要
- Java线程分为两类分别为daemon线程(守护线程)和User线程(用户线程),在JVM启动时候会调用main函数,main函数所在的线程
- /* String name = "adsbsadgsadgtewterfsdf"
- C++在vscode中的多文件编程相信有很多的小伙伴在一开始的时候,都会对vscode的多文件编程有很多的疑问,网上也有很多的教学,不过网上
- kafka消费者kafka-console-consumer接收不到数据发送端接收端问题采用内置的zookeeper,发送端发送数据,接收端
- 在上篇中,我解析了前 10 道题目,本篇我将尝试解析后面剩下的所有题目。姐妹篇:解析“60k”大佬的19道C#面试题(上)这些题目确实不怎么