@Around注解怎么在Spring AOP中使用

  介绍

这期内容当中小编将会给大家带来有关@Around注解怎么在Spring AOP中使用,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

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

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

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

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

完整演示代码如下:

需要说明的是,在以下例子中,我们即可以只用@Around注解,并设置条件,见方法run1();也可以用@Pointcut和@Around联合注解,见方法pointCut2()和run2(),这2种用法是等价的。如果我们还想利用其进行参数的修改,则调用时必须用的连接点。进行(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;   ,/* *   *,才能调用控制器包下的任意类的任意方法时均会调用此方法   ,*/,@Around(“执行(* com.company.controller。* . * (. .)“)   ,public  Object  run1 (ProceedingJoinPoint )的连接点,throws  Throwable  {//才能获取方法参数值数组   对象[],才能args =, joinPoint.getArgs ();//得才能到其方法签名   MethodSignature 才能;MethodSignature =, (MethodSignature), joinPoint.getSignature ();//才能获取方法参数类型数组   类[],才能paramTypeArray =, methodSignature.getParameterTypes ();   if 才能;(EntityManager.class.isAssignableFrom (paramTypeArray [paramTypeArray.length 作用;1])),{   ,,//如果方法的参数列表最后一个参数是entityManager类型,则给其赋值   ,,arg游戏[args.length 安康;1],=,entityManager;   ,,}   logger.info才能(“请求参数为{}“,args);//才能动态修改其参数//才能注意,如果调用joinPoint.proceed()方法,则修改的参数值不会生效,必须调用joinPoint.proceed (Object [], args)   Object 才能;result =, joinPoint.proceed (args);   logger.info才能(“响应结果为{}“,结果);//才能如果这里不返回结果,则目标对象实际返回值会被置为零   return 才能;结果;   ,}   ,   ,@Pointcut(“执行(* com.company.controller。* . * (. .)“)   ,public  void  pointCut2 (), {}   ,   ,@Around (“pointCut2 ()“)   ,public  Object  run2 (ProceedingJoinPoint )的连接点,throws  Throwable  {//才能获取方法参数值数组   对象[],才能args =, joinPoint.getArgs ();//得才能到其方法签名   MethodSignature 才能;MethodSignature =, (MethodSignature), joinPoint.getSignature ();//才能获取方法参数类型数组   类[],才能paramTypeArray =, methodSignature.getParameterTypes ();   if 才能;(EntityManager.class.isAssignableFrom (paramTypeArray [paramTypeArray.length 作用;1])),{   ,,//如果方法的参数列表最后一个参数是entityManager类型,则给其赋值   ,,arg游戏[args.length 安康;1],=,entityManager;   ,,}   logger.info才能(“请求参数为{}“,args);//才能动态修改其参数//才能注意,如果调用joinPoint.proceed()方法,则修改的参数值不会生效,必须调用joinPoint.proceed (Object [], args)   Object 才能;result =, joinPoint.proceed (args);   logger.info才能(“响应结果为{}“,结果);//才能如果这里不返回结果,则目标对象实际返回值会被置为零   return 才能;结果;   ,}   }

<>强补充:Spring Aop实例(Aop如此简单)@Aspect, @Around注解方式配置

@Around注解怎么在Spring AOP中使用