最近在研究Springboot切面编程,碰到一个莫名其妙的问题,aop怎么都不起作用。自定义的注解使用到了aop,却是有效的。

网上查找了几个小时, 各种方式都试了(使用的是InteliJ IDEA编辑器)。

首先确认了pom.xml文件里是载入了aop的

其次,确认了切面类是没有问题的,

package com.jeealfa.aspect;import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;import javax.servlet.http.HttpServletRequest;@Aspect
@Component
public class AopLog {private Logger log = LoggerFactory.getLogger(this.getClass());//线程局部变量,用于解决多线程中相同变量的访问冲突问题ThreadLocal<Long> startTime = new ThreadLocal<>();@Pointcut("execution(* com.jeealfa.controller..*.*(..))")public void aopWebLog() {}@Before("aopWebLog()")public void doBefore(JoinPoint joinPoint) throws Throwable {startTime.set(System.currentTimeMillis());//接手到请求,记录请求内容ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();HttpServletRequest request = attributes.getRequest();log.info("URL:" + request.getRequestURI().toString());log.info("HTTP Method:" + request.getMethod());log.info("IP:" + request.getRemoteAddr());log.info("类的方法:" + joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName());log.info("参数:" + request.getQueryString());System.out.println(request.getRequestURI().toString());}
}

再次,根据网上查的资料在启动类加了注解,且aspect文件夹与JeealfaBootApplication处于平级

package com.jeealfa;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.context.annotation.ComponentScan;import org.springframework.context.annotation.EnableAspectJAutoProxy;@SpringBootApplication@EnableAspectJAutoProxy(proxyTargetClass=true)@ComponentScan({"com.jeealfa.*"})public class JeealfaBootApplication {public static void main(String[] args) {SpringApplication.run(JeealfaBootApplication.class, args);}}

实际@SpringBootApplication包含了@CompentScan

另外,HelloController类hello方法如下

package com.jeealfa.controller; import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap; @RestController
@Slf4j
public class HelloController { @GetMapping("/hello") public String hello(){ return "hello world"; }
}

网上各种方法都试了, aop就是始终不起作用。 运行 /hello时,AopLog里的doBefore方法始终没有运行。并且发现一个奇怪现象,其他文件修改,springboot的热启动都会自动更新启动,修改这个切面类时,却无反应。

不过最终经过多次折腾终于发现了问题所在。

在创建这个切面类时,直接选择了 Aspect, 见下图

创建了之后, 然后在把aspect修改为class,

修改为class后,左边最前面的A标会自动变成C标,这样就跟从Java Class创建的切面类看起来一模一样,但就是不起作用。

正确的做法: 通过Java Class创建aspect类,然后加上 @Aspect和@Component注解。 我试了从Java Class创建aspect类,把之前无效的代码完整拷贝到这个新建的文件里,就生效了。至于上面那种创建aspect类为何会导致无效的内在原因,还不清楚,有知情的朋友请留言回复。 虽然两种创建方式不同,但最终代码呈现完全是一样的,就是一个有用一个无用。

Springboot aop不起作用的问题相关推荐

  1. SpringBoot+AOP实现多数据源动态切换

    SpringBoot+AOP实现多数据源动态切换 背景 设计总体思路 步骤 背景 系统后端需要访问多个数据库,现有的数据库连接配置写入配置文件中.后端需要从一个数据库的配置表里动态的读取其它mysql ...

  2. SpringBoot+AOP(@Around)

    SpringBoot+AOP(@Around) 虽然SpringBoot很方便,可以使我们不太懂原理的情况下都可以轻松的写出一个CRUD的项目,但是SpringBoot的控制反转和依赖注入我们时时刻刻 ...

  3. springBoot+AOP收集日志信息,自定义接口实现日志收集

    之前做的ELK日志分析,没有收集到日志,都 是一些没有规则的输出,提取数据也相对复杂, 今天 有时间就稍微实现了一下利用SpringBoot Aop的方式打印想要的数据格式, 第一步,自定义接口, E ...

  4. SpringBoot AOP(内含源代码)

    SpringBoot AOP(内含源代码) 源代码下载链接:https://download.csdn.net/download/weixin_46411355/87399904 目录 SpringB ...

  5. SpringBoot AOP中JoinPoint的用法和通知切点表达式

    前言 上一篇文章讲解了springboot aop 初步完整的使用和整合 这一篇讲解他的接口方法和类 JoinPoint和ProceedingJoinPoint对象 JoinPoint对象封装了Spr ...

  6. SpringBoot+AOP实现动态切换数据源

    首先描述下笔者的基本步骤: 1.yml配置文件中定义多数据源: 2.自定义一个注解类(@DataSource 可标注在类或方法上),定义String类型的变量value,value中存储数据源名称: ...

  7. 如何使用SpringBoot AOP 记录操作日志、异常日志?

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 作者:咫尺的梦想_w cnblogs.com/wm-dv/ ...

  8. springboot aop + logback + 统一异常处理 打印日志

    springboot aop + logback + 统一异常处理 打印日志 参考文章: (1)springboot aop + logback + 统一异常处理 打印日志 (2)https://ww ...

  9. SpringBoot AOP完全讲解二:统一处理请求日志

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/80669451 本文出自[赵彦军的博客] 前言 不了解 AOP 概念的同学,请先看 ...

  10. Spring-Boot + AOP实现多数据源动态切换

    2019独角兽企业重金招聘Python工程师标准>>> 最近在做保证金余额查询优化,在项目启动时候需要把余额全量加载到本地缓存,因为需要全量查询所有骑手的保证金余额,为了不影响主数据 ...

最新文章

  1. Spring《五》集合的注入方式
  2. 快卷疯了!被面试官说我是今天第5个背八股文的。。。
  3. RGB+Depth规则箱体测量方案
  4. c#结合emgucv进行人脸检测_人脸识别与测温结合在办公场景有哪些应用?
  5. 使用DispatchAction类,为你的系统减肥!
  6. MySQL性能调优与架构设计——第5章 备份与恢复
  7. HDU4279(2012年天津网络赛---数论分析题)
  8. JHipster生成微服务架构的应用栈(一)- 准备工作
  9. NWERC2020J-Joint Excavation【构造,贪心】
  10. windows下实现自己的第一个python脚本文件并.exe运行
  11. html ui 下拉列表,Atitit.ui控件-下拉菜单选择控件的实现select html_html/css_WEB-ITnose...
  12. 字符串过滤非数字c语言,【新手】【求思路】如何判断用户输入的字符串中是否含有非数字?...
  13. Flash CS4学习笔记1
  14. 图片怎么做雕刻路径_浮雕做图的简要步骤
  15. 编译原理学习笔记 3.6 词法分析程序的自动生成器—LEX(LEXICAL)
  16. PHP自学笔记 ---李炎恢老师PHP第一季 TestGuest0.4
  17. sina vistor system
  18. 免费教程《Excel VBA:办公自动化》
  19. HashMap常见面试题汇总:建议初步了解源码后再细品
  20. 《白话大数据与机器学习》学习笔记

热门文章

  1. 开发学习过程中收集到的有趣段子与图片汇总(持续更新)
  2. win10系统如何打开telnet服务器,Win10专业版如何开启telnet命令|开启telnet服务方法...
  3. osg gis编译日志
  4. 自定义pageradapter
  5. 跨部门沟通技巧有哪些?
  6. Ubuntu系统网络连不上线缆已拔出服务启动
  7. NSS External acceleration control with PCC
  8. 5位运动员参加了10米台跳水比赛
  9. 【C编程】比较计数法排序
  10. 计算机秦皇岛科技师范学院分数线,河北科技师范学院历年录取分数线+河北历年分数线...