由于业务需求,需要编写一个AOP用来记录一些外部接口的调用日志.

首先是引入切面要用到的jar包,maven工程加入如下所示:

然后是配置文件,由于要在controller层加上切面,因此需要在springMVC的配置文件上加上

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

如此,配置文件的修改就完成了.

接下来就是编写切面类了,代码如下:

import java.text.SimpleDateFormat;
import java.util.HashMap;
import java.util.Map;

import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
 * 切面类
 * <p>
 * 记录日志
 */
// 声明这是一个组件
@Component
// 声明这是一个切面Bean
@Aspect
public class LogAspect {

/**
* 日志记录工具
*/
private static final Logger LOGGER = LogManager.getLogger(LogAspect.class);

/**
* 默认构造函数
*/
public LogAspect() {
System.out.println("初始化切面");
}

/**
* 配置切入点,该方法无方法体,主要为方便同类中其他方法使用此处配置的切入点,第一种配置切入点的方法
* <p>
* 扫描com.test.controller.TestController下面的所有方法
* @see [类、类#方法、类#成员]
*/
@Pointcut("execution(* com.test.controller.Test1Controller..*(..))")
public void aspectTest1() {
}

/**
* 配置前置通知,使用在方法aspect()上注册的切入点,第二种配置切入点的方法
* <p>
* 同时接受JoinPoint切入点对象,可以没有该参数

* @param joinPoint切入点
* @see [类、类#方法、类#成员]
*/
@Before("execution(* com.test.controller.Test2Controller..*(..))")
private void beforeTest2(JoinPoint joinPoint) {

String className = joinPoint.getTarget().getClass().getName();    //类名
String methodName = joinPoint.getSignature().getName();            //方法名

}

@Before("aspectTest1()")
private void beforeTest1(JoinPoint joinPoint) {
String className = joinPoint.getTarget().getClass().getName();
String methodName = joinPoint.getSignature().getName();
}

/**
* 配置后置通知,使用在方法aspect()上注册的切入点
* <p>
* </p>

* @param joinPoint
*            切入点
* @see [类、类#方法、类#成员]
*/
@After("aspectTest1()")
private void after(JoinPoint joinPoint) {
System.out.println("after");
}

/**
* 配置环绕通知,使用在方法aspect()上注册的切入点
* <p>
* 记录方法开始到结束的耗时

* @param joinPoint
*            切入点
* @return Object 处理结果
* @throws Throwable
*             异常
* @see [类、类#方法、类#成员]
*/
@Around("aspectTest1()")
private Object around(JoinPoint joinPoint) throws Throwable {
                System.out.println("环绕通知前....");
ProceedingJoinPoint tempJoinPoint = (ProceedingJoinPoint) joinPoint;
/*Object object = tempJoinPoint.proceed();*/
System.out.println("环绕通知后....");

//return object;

return null;

}

/**
* <配置后置返回通知,使用在方法aspect()上注册的切入点
* <p>

* @param joinPoint
*            切入点
* @see [类、类#方法、类#成员]
*/
@AfterReturning(returning = "rvt", value = "aspectTest1()")
public void afterReturn(JoinPoint joinPoint, Object rvt) {
String className = joinPoint.getTarget().getClass().getName();
String methodName = joinPoint.getSignature().getName();
String args = "";
for (int i = 0; i < joinPoint.getArgs().length; i++) {
args = args + joinPoint.getArgs()[i] + ",";
}
args = args.substring(0, args.length() - 1);
String OutParam="";
if(rvt!=null){
OutParam=rvt.toString();
}
System.out.println("rvt");
}

/**
* 配置抛出异常后通知,使用在方法aspectTest1()上注册的切入点
* <p>
* </p>

* @param joinPoint
*            切入点
* @param ex
*            异常
* @see [类、类#方法、类#成员]
*/
@AfterThrowing(pointcut = "aspectTest1()", throwing = "ex")
public void afterThrow(JoinPoint joinPoint, Exception ex) {
System.out.println("afterThrow");
}

}
切面类至此就写完了,

然后就是要切入的类和方法,这里就不写了.

写完之后运行,测试,发现,before的切入点并没有进去,而其他的切入点(除了AfterThrowing)均有输出,要切入的业务方法也没进去,

刚开始以为配置问题,不停地修改配置,什么加包扫描啊,配置实体啊,各种方法都不行,最后发现是因为自己偷懒,将环绕通知的进程方法注释调了,导致程序在进入切面之后,无法正常执行,将这个注释去掉之后,切面就可以正常使用了.

所以,以后在配置切面时,要么不写环绕的部分,要么就要写完,千万不要偷懒.
--------------------- 
作者:yaotou402 
来源:CSDN 
原文:https://blog.csdn.net/u010524100/article/details/79527300 
版权声明:本文为博主原创文章,转载请附上博文链接!

Spring AOP不进入before和业务方法,却进入其他切面的问题相关推荐

  1. java方法设置切点_java相关:Spring AOP中定义切点的实现方法示例

    java相关:Spring AOP中定义切点的实现方法示例 发布于 2020-6-6| 复制链接 摘记: 本文实例讲述了Spring AOP中定义切点的实现方法.分享给大家供大家参考,具体如下:一 配 ...

  2. java获取方法上的注解_Spring:使用Spring AOP时,如何获取目标方法上的注解

    当使用spring AOP时,判断目标方法上的注解进行相关操作,如缓存,认证权限等 自定义注解 packagecom.agent.annotation;importjava.lang.annotati ...

  3. Spring AOP:原理、 通知、连接点、切点、切面、表达式

    0:Spring AOP 原理 简单说说 AOP 的设计: 每个 Bean 都会被 JDK 或者 Cglib 代理.取决于是否有接口. 每个 Bean 会有多个"方法拦截器".注意 ...

  4. Spring AOP方法分析

    Spring AOP方法分析 此示例显示如何配置Spring AOP方法概要分析.我们可以在任何服务(或其他)类中使用Spring AOP和任何方法,而无需在任何服务类中编写任何一行分析代码.面向方面 ...

  5. 利用spring aop统一处理异常和打日志

    利用spring aop统一处理异常和打日志 spring aop的概念,很早就写博客介绍了,现在在工作中真正使用. 我们很容易写出的代码 我们很容易写出带有很多try catch 和 logger. ...

  6. java args例子_Spring AOP中使用args表达式的方法示例

    本文实例讲述了Spring AOP中使用args表达式的方法.分享给大家供大家参考,具体如下: 一 配置 xmlns:xsi="http://www.w3.org/2001/XMLSchem ...

  7. 比较Spring AOP与AspectJ

    本文翻译自博客Comparing Spring AOP and AspectJ 介绍 如今有多个可用的AOP库,这些组件需要回答一系列的问题: 是否与我现有的应用兼容? 我在哪实现AOP? 集成到我的 ...

  8. 彻底理解Spring AOP

    目录 前言 1. AOP概念 2. AOP的实现 3. Spring的IoC理解: 4. Sping知识整理 前言 AOP英文名为Aspect Oriented Programming,意为面向切面编 ...

  9. spring --AOP

    在说AOP之前,先来看看切片面包,我们是把面包看成一个对象,而如果想在面包中间夹点番茄酱或者其他什么东西怎么办呢,是不是需要把面包切片,在每一片都要夹点东西,在编程中给对象重复性 执行某一动作是不是特 ...

  10. Spring AOP Capability and goals

    5.1.AOP概念 让我们首先定义一些中心AOP概念和术语.这些术语不是特定于Spring的.不幸的是,AOP术语不是特别直观.但是,如果Spring使用自己的术语,那将更加令人困惑. 方面:跨越多个 ...

最新文章

  1. mysqldump 导入数据库可能遇到错误
  2. 体系文件管理解决方案
  3. PAT甲级1136 A Delayed Palindrome :[C++题解]回文串和高精度并输出过程
  4. 微服务之迷思--转几位大牛的文章
  5. 在ASP.Net Core 中使用枚举类而不是枚举
  6. 【汇编语言】(王爽)实验4解答
  7. LWIP初体验-修改ST官方demo
  8. 设计轻松应用素材 | 免抠png和图标上哪找
  9. pycharm的terminal无法识别到命令 pytest 不是内部或外部命令,也不是可运行的程序 或批处理文件。
  10. ado.net知识点博客网址
  11. thinkphp5 一周学习总结 10月12日
  12. python数据结构之匿名函数lambda
  13. 十大蓝牙耳机排行榜:2021年值得关注的十大蓝牙耳机排名
  14. java 获取jsessionid_如何从JSESSIONID加载Java HttpSession?
  15. 图片从RGB转换成Lab
  16. 软件工程大学生职业生涯规划_我的大学生职业生涯规划书(软件工程专业的职业生涯规划书)...
  17. Pycharm里面的一些超级好用的功能——(TODO注释)用法防遗忘大法
  18. Shopee上货软件,新手小白必备神器
  19. 一篇文章从了解到入门shell
  20. cents7.6安装rancher

热门文章

  1. 云计算发展趋势分析(一)之OpenStack vs. K8S
  2. “记忆宫殿”等五大方法,拯救你衰退中的记忆力
  3. bcftools操作vcf文件
  4. kubernetes的eviction机制
  5. 水星如何设置虚拟机服务器,水星mercury路由器电脑怎么设置?
  6. linux sort命令优化提高速度
  7. mac版caj阅读器怎么删除标注_CAJViewer for mac-caj阅读器Mac版下载 V1.5-PC6苹果网
  8. R语言_根据马科维茨投资组合理论画出最优投资组合线
  9. hp服务器修改bios做系统,hp 服务器bios设置
  10. wind7计算机控制面板在哪,Win7控制面板在哪打开|win7打开控制面板的小技巧