好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

SpringMVC记录我遇到的坑_AOP注解无效,切面不执行的解决

AOP注解无效,切面不执行的解决

想做一个api请求日志,想到使用aop,配置过程中遇到了一个坑,aop不起作用,

我的aop是这样的:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

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配置:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

< web-app xmlns = "http://java.sun测试数据/xml/ns/javaee" xmlns:xsi = "http://HdhCmsTestw3.org/2001/XMLSchema-instance"

          xsi:schemaLocation="http://java.sun测试数据/xml/ns/javaee

           http://java.sun测试数据/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切面不成功解决

需要在配置文件中加入

?

1

<aop:aspectj-autoproxy proxy-target- class = "true" />

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。

原文链接:https://blog.csdn.net/z781582206/article/details/77894774

查看更多关于SpringMVC记录我遇到的坑_AOP注解无效,切面不执行的解决的详细内容...

  阅读:21次