一次 spring aop 集成的踩坑之旅

之前的项目一直使用的是springboot框架,aop 直接引入jar包就能正常使用,免去了繁琐的配置过程。这次用回springmvc第一次自己动手集成springmvc 的spring-aop 。踩了不少坑 .首先spring-aop 所依赖的三个jar包

```

<dependency>

      <groupId>org.springframework</groupId>

      <artifactId>spring-aop</artifactId>

      <version>${spring-version}</version>

</dependency>

<dependency>

      <groupId>org.aspectj</groupId>

      <artifactId>aspectjweaver</artifactId>

      <version>1.8.9</version>

</dependency>

<dependency>

      <groupId>org.aspectj</groupId>

      <artifactId>aspectjrt</artifactId>

      <version>1.8.9</version>

</dependency>

```

第一次踩坑就出现在 maven 引入jar 包的时候。当我写好pom文件,启动项目

不出意外 报错了

```

报错error at ::0 can't find referenced pointcut

```

翻看资料发现是 aspectj jar包低版本会造成这种原因,开始我引入的是1.5的版本,但是升到1.8以后还是同样的问题。

于是查看maven依赖,好吧,这两个jar包没有下载成功。于是在maven 镜像仓库 下载jar包后,解决问题。

这次顺利的启动,但是进行请求调用的时候,aop 却并没有触发。

```

@Pointcut("@annotation(org.springframework.web.bind.annotation.RequestMapping)")

    public void pointcut(){};

    @Around("pointcut()")

    public Object interceptor(ProceedingJoinPoint pjp) throws Throwable{

        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();

        String params = getParamValue(request);

        logger.info("====================="+ params);

        Object obj = pjp.proceed();

        logger.info("====================="+ obj);

//        response.setContentType("text/html;charset=UTF-8");

//        response.getOutputStream().write("测试".getBytes());

        return obj;

```

又一次陷入只是盲区。查看相关的配置文件。发现原来aop的配置文件没有写对位置,导致aop没有加载上。

正确的加载位置是在webapp 下的web.xml中的classpath:的位置。

```

<servlet>

<servlet-name>appServlet</servlet-name>

<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

<init-param>

<param-name>contextConfigLocation</param-name>

<param-value>classpath:spring/servlet-*.xml</param-value>

</init-param>

<load-on-startup>1</load-on-startup>

</servlet>

```

于是找到这个配置文件 加入

```

<!-- 支持 @AspectJ 标记 -->

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

```

重启项目,进行访问,成功进入aop 处理逻辑。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容