Spring AOP 切面@Around注解的具体使用

Spring AOP 切面@Around注解的具体使用@Around注解可以用来在调用一个具体方法前和调用后来完成一些具体的任务。比如我们想在执行controller中方法前打印出请求参数,并在方法执行结束后来打印出响应值,这个时候,我们就可以借助于@Around注解来实现;再比如我们想在执行方法时动态修改参数值等类似功能的注解还有@Before等等,用到了SpringAOP切面思想,SpringAOP常用于拦截器、事务、日志、权限验…

大家好,又见面了,我是你们的朋友全栈君。

@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);

    @Autowired
    private 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,则目标对象实际返回值会被置为null
        return 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,则目标对象实际返回值会被置为null
        return result;
    }
}

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/159754.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 中国移动DNS大全「建议收藏」

    中国移动DNSIP地址,包括广东移动DNS,上海移动DNS,北京移动DNS,陕西移动DNS,江苏移动,山东移动DNS等共全国32个移动省份的DNSIP地址。DNS用户数国家省份地区运营商用户数排名(省份)用户数比例(省份)112.4.0.551111900中国陕西西安移动59.84%221.131.143.691022100中国…

    2022年4月15日
    939
  • siamfc++代码_asic芯片设计

    siamfc++代码_asic芯片设计SiamFC论文解读及代码实现摘要:传统上,任意目标跟踪的问题是通过专门在线学习目标外观的模型来解决的,使用视频本身作为唯一的训练数据。尽管这些方法取得了成功,但他们的纯在线方法固有地限制了他们可以学习的模型的丰富性。最近,有人试图利用深层卷积网络的表达能力。然而,当要跟踪的目标事先未知时,需要在线执行随机梯度下降以适应网络的权重,这严重影响了系统的速度。在本文中,我们在ILSVRC15数据集上为视频中的目标检测配备了一个基本的跟踪算法和一个新的端到端训练的孪生神经网络。我们的跟踪器以超过实时的帧速率运

    2022年10月1日
    0
  • oracle保留小数位数

    oracle保留小数位数公司需要处理一些报表,需要使用百分率,保留2位小数,只用round和trunc函数都可以实现(round(_data,2)),只是格式不是很工整,对格式要求不严谨的情况下使用round即可公司需要处理一些报表,需要使用百分率,保留2位小数,只用round和trunc函数都可以实现(round(_data,2)),只是格式不是很工整,对格式要求不严谨的情况下使用round即可.个人认为比较方便的一种selectdecode(n_jg,0,’0.00′,trim(to_char(n_jg,’999

    2022年7月24日
    5
  • JBPM工作流的性能问题「建议收藏」

    JBPM工作流的性能问题「建议收藏」前言:我计划把我的blog从51cto移到javaeye,陆陆续续地把我对工作流的理解贴上来,和大家交流。我在项目中应用过jbpm工作流,总体而言,jbpm是诸多开源workflow中比较好的一个。他的面向图的设计比起那些一味宣称遵守所谓的WfMC规范的工作流好多了。在应用的过程中,我发现jbpm还是有不少问题,其中性能问题比较突出。主要表现为:1、任务分配的表设计不合理,如果…

    2022年9月9日
    2
  • C# 实现开心网外挂(一)[通俗易懂]

    C# 实现开心网外挂(一)[通俗易懂]最近越来越火的开心001,功能愈加增多,操作也愈加繁琐,因此,何不自己动手,制作一个简单的小外挂来完成一些简单重复的工作呢?其实实现开心网外挂十分简单,特别是使用C#这种已经封装得比较好的语言,只需略加修饰,就可以完成符合自己要求的外挂和完成基本的功能。现在就用C#这种语言带着大家一起来制作一个简单的开心网外挂吧。首先我们需要一个抓包程序,来捕获开心网相关的各种包。这种抓包程序网上网…

    2022年9月12日
    2
  • 安装cgal_cgi3.2

    安装cgal_cgi3.2在VisualStudio2008中安装CGAl(注意:整个安装过程需要网络连接,最后指示如何在windows中增加环境变量)1、下载需要的安装文件1)、首先下载CGAL(3.4)的安装程序,从http://gforge.inria.fr/frs/?group_id=52(在页面的最下面)2)、获得最新版本的CMake(目前是2.6.3),从http://www.cmake.or

    2025年6月12日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号