@Around注解可以用来在调用一个具体方法前和调用后来完成一些具体的任务。

比如我们想在执行controller中方法前打印出请求参数,并在方法执行结束后来打印出响应值,这个时候,我们就可以借助于@Around注解来实现;

再比如我们想在执行方法时动态修改参数值等

类似功能的注解还有@Before等等,用到了Spring AOP切面思想,Spring AOP常用于拦截器、事务、日志、权限验证等方面。

完整演示代码如下:

需要说明的是,在以下例子中,我们即可以只用@Around注解,并设置条件,见方法run1();也可以用@Pointcut和@Around联合注解,见方法pointCut2()和run2(),这2种用法是等价的。如果我们还想利用其进行参数的修改,则调用时必须用joinPoint.proceed(Object[] args)方法,将修改后的参数进行回传。如果用joinPoint.proceed()方法,则修改后的参数并不会真正被使用。

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;import javax.persistence.EntityManager;/*** 控制器切面** @author lichuang*/@Component
@Aspect
public class ControllerAspect {private static final Logger logger = LoggerFactory.getLogger(ControllerAspect.class);@Autowiredprivate EntityManager entityManager;/*** 调用controller包下的任意类的任意方法时均会调用此方法*/@Around("execution(* com.company.controller.*.*(..))")public Object run1(ProceedingJoinPoint joinPoint) throws Throwable {//获取方法参数值数组Object[] args = joinPoint.getArgs();//得到其方法签名MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();//获取方法参数类型数组Class[] paramTypeArray = methodSignature.getParameterTypes();if (EntityManager.class.isAssignableFrom(paramTypeArray[paramTypeArray.length - 1])) {//如果方法的参数列表最后一个参数是entityManager类型,则给其赋值args[args.length - 1] = entityManager;}logger.info("请求参数为{}",args);//动态修改其参数//注意,如果调用joinPoint.proceed()方法,则修改的参数值不会生效,必须调用joinPoint.proceed(Object[] args)Object result = joinPoint.proceed(args);logger.info("响应结果为{}",result);//如果这里不返回result,则目标对象实际返回值会被置为nullreturn result;}@Pointcut("execution(* com.company.controller.*.*(..))")public void pointCut2() {}@Around("pointCut2()")public Object run2(ProceedingJoinPoint joinPoint) throws Throwable {//获取方法参数值数组Object[] args = joinPoint.getArgs();//得到其方法签名MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();//获取方法参数类型数组Class[] paramTypeArray = methodSignature.getParameterTypes();if (EntityManager.class.isAssignableFrom(paramTypeArray[paramTypeArray.length - 1])) {//如果方法的参数列表最后一个参数是entityManager类型,则给其赋值args[args.length - 1] = entityManager;}logger.info("请求参数为{}",args);//动态修改其参数//注意,如果调用joinPoint.proceed()方法,则修改的参数值不会生效,必须调用joinPoint.proceed(Object[] args)Object result = joinPoint.proceed(args);logger.info("响应结果为{}",result);//如果这里不返回result,则目标对象实际返回值会被置为nullreturn result;}
}

Spring AOP 切面@Around注解的具体使用相关推荐

  1. 【经典】Spring aop切面实现异步添加日志—完整版

    系统开发中我们常遇到要处理系统日志等信息的,在此我分享一篇 利用spring aop切面来异步添加日志的操作,其中用到了 队列和多线程,前面的博客有写. 第一步:创建log实体,根据自己业务而定, p ...

  2. spring AOP切面日志

    spring AOP切面日志 导入依赖 <properties><fastjson.version>1.2.49</fastjson.version> </p ...

  3. Spring AOP切面的时候参数的传递

    Spring AOP切面的时候参数的传递 Xml: <?xml version="1.0" encoding="UTF-8"?> <beans ...

  4. spring aop 切面添加日志

    这是一个非常简单的spring aop切面添加日志的程序,下面来看一下这个程序 1.程序使用jar包 2.切面类LoggingAspect.java package com.cailei.aop.as ...

  5. 【Spring AOP】基于注解的 AOP 编程

    Spring AOP 基于注解的 AOP 编程的开发 开发步骤 切入点复用 切换动态代理的创建方式(JDK.Cglib) AOP 开发中的一个坑(业务方法互相调用) AOP 知识总结 更多内容请查看笔 ...

  6. Spring AOP切面使用详细解析

    相关文章: SpringBoot AOP切面的使用 一步一步手绘Spring AOP运行时序图(Spring AOP 源码分析) 架构师系列内容:架构师学习笔记(持续更新)) Spring AOP 应 ...

  7. 日志管理(spring AOP切面拦截)

    **最近,在写日志管理的东西呢,用了几种方法试,还是拦截比较好用,直接截下来传入到数据库中存储. 写的时候,真是头疼啊. 哦~对了,忘了说了,不需要用到Dao层哦. 首先,来一个POJO实体类吧,我看 ...

  8. Spring AOP 切面(Aspect)应用详解

    1. AOP 切面应用 下面是一个AOP切面的一个简单的应用实例 引入AOP依赖 <dependency><groupId>org.springframework.boot&l ...

  9. 利用Spring AOP与JAVA注解为系统增加日志功能

    Spring AOP一直是Spring的一个比较有特色的功能,利用它可以在现有的代码的任何地方,嵌入我们所想的逻辑功能,并且不需要改变我们现有的代码结构. 鉴于此,现在的系统已经完成了所有的功能的开发 ...

最新文章

  1. 由于未能创建 Microsoft Visual C# 2008 编译器,因此未能打开项目 ...的解决方法...
  2. 怎么用python判断数据是否已经存在于表里_数据基本操作(二)
  3. python 多态 知乎_Python函数接口的一些设计心得
  4. 机器学习问题方法总结
  5. 每个叶子节点(nil)是黑色。_填充每个节点的下一个右侧节点指针
  6. atitit.网络文件访问协议.unc smb nfs ftp http的区别
  7. c++程序内嵌lua字节码
  8. Android 持续集成基础教程
  9. 21世纪需要的七种人才—李开复
  10. NVIDIA INSTANT NGP
  11. 【C++】整型溢出问题
  12. win10安装oracle数据库失败
  13. 洛谷P5385 [Cnoi2019]须臾幻境
  14. Hinton NIPS2017 手写识别实现 TensorFlow \ Pytorch \ Keras
  15. linux rm 回收站,给rm设置回收站
  16. 玩转iOS开发:iOS 10 新特性《Siri Kit》
  17. 爬取东方财富网股票行情数据和资讯
  18. NOI2010~NOI2018选做
  19. zblog html代码,ZBLOG调出最新留言评论内容代码
  20. 【bzoj3620】【似乎在梦中见过的样子】【kmp】

热门文章

  1. 【C语言进阶】常见数据格式转换处理的代码实现
  2. ping:www.baidu.com 未知的名称或服务解决办法​​​​​​​
  3. 微信小程序中的vw和vh单位
  4. Mysql配置文件/etc/my.cnf解析
  5. Ninja工具介绍及基本语法
  6. ES6语法——for...in..以及字符串新增操作
  7. 金融科技大数据产品推荐:荣之联·风报—人工智能企业情报分析系统
  8. BRINSON理论 - 投资组合表现的决定因素
  9. 【启明云端】启明云端带你揭开WT32-S3-WROVER神秘面纱
  10. 文献阅读-Clinical and Biological subtypes of B-cell lymphoma revealed by microenvironment signature