JAVA-Spring注解实现AOP权限拦截,如何取得方法上自定义Annotation的值呢?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA-Spring注解实现AOP权限拦截,如何取得方法上自定义Annotation的值呢?相关的知识,希望对你有一定的参考价值。

比如说我在一个要拦截的方法上定义了一段自定义的Annotation

@getView(Method="aa",Value="bb")
public String getName()
return "XXX";

现在我想在AOP的环绕通知时取得@getView(Method="aa",Value="bb") 的aa和bb应该怎么获取?

参考技术A import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

@Retention(RetentionPolicy.RUNTIME)
@interface GetView

String Method();

String Value();



public class Temp

@GetView(Method = "aa", Value = "bb")
public void test()
System.out.println("In test method.");


public static void main(String[] args) throws ClassNotFoundException, IllegalArgumentException, IllegalAccessException, InvocationTargetException, SecurityException, NoSuchMethodException

Temp temp = new Temp();
Method method = temp.getClass().getMethod("test");
System.out.println(method.isAnnotationPresent(GetView.class));
method.invoke(temp);
GetView view = method.getAnnotation(GetView.class);
System.out.println(view.Method());
System.out.println(view.Value());


本回答被提问者和网友采纳
参考技术B 你应该可以获取到 Method 对象,这个代表你拦截到的 方法 method.getAnnotation(getView.class); 你就可以获取到 对应的注解对象,然后通过注解对象,获取注解里面对应的属性值。 参考技术C 主要问题在于不同的Annotation的拦截是不同的。 例如method级别的拦截。我们可以通过getMethodAnnotation(Class)的获取annotation。如果没有设置annotation,获取为空。
举个例子:
// 这里判断是否拦截方法
if(!(handler instanceof HandlerMethod))
return true;

HandlerMethod method = (HandlerMethod)handler;
//这里获取了一个Menu的annotation。
Menu sm = method.getMethodAnnotation(Menu.class);

if(sm!=null) //如果确实设置了Menu的annotation,就会进入此区域。

SpringBoot AOP注解式拦截与方法规则拦截

     AOP的本质还是动态代理对方法调用进行增强。

  SpringBoot 提供了方便的注解实现自定义切面Aspect。

  1、使用需要了解的几个概念:

            切面、@Aspect

            切点、@Pointcut、

            通知、@Before/@After/@Around/@AfterReturning/@AfterThrowing

 

  2、Pointcut expression表达式规则 

    Pointcut 是指那些方法需要被执行"AOP",是由"Pointcut Expression"来描述的.
    Pointcut可以有下列方式来定义或者通过通配符&& || !的方式进行组合.


    args()、@args() 

    execution()

    this()

    target() 、@target()

       within()、@within()

    @annotation

 

举例说明:
  任意公共方法的执行:
  execution(public * *(..))

 

  任何一个以“set”开始的方法的执行:
  execution(* set*(..))‘


  AccountService 接口的任意方法的执行:
  execution(* com.xyz.service.AccountService.*(..))

  定义在service包里的任意方法的执行:
  execution(* com.xyz.service.*.*(..))

  定义在service包和所有子包里的任意类的任意方法的执行:
  execution(* com.xyz.service..*.*(..))

  定义在pointcutexp包和所有子包里的JoinPointObjP2类的任意方法的执行:
  execution(* com.test.spring.aop.pointcutexp..JoinPointObjP2.*(..))")
  ***> 最靠近(..)的为方法名,靠近.*(..))的为类名或者接口名,如上例的JoinPointObjP2.*(..))

  pointcutexp包里的任意类.
  within(com.test.spring.aop.pointcutexp.*)


  pointcutexp包和所有子包里的任意类.
  within(com.test.spring.aop.pointcutexp..*)


  实现了Intf接口的所有类,如果Intf不是接口,限定Intf单个类.
  this(com.test.spring.aop.pointcutexp.Intf)
  ***> 当一个实现了接口的类被AOP的时候,用getBean方法必须cast为接口类型,不能为该类的类型.

  带有@Transactional标注的所有类的任意方法.
  @within(org.springframework.transaction.annotation.Transactional)
  @target(org.springframework.transaction.annotation.Transactional)

  带有@Transactional标注的任意方法.
  @annotation(org.springframework.transaction.annotation.Transactional)
  ***> @within和@target针对类的注解,@annotation是针对方法的注解

  参数带有@Transactional标注的方法.
  @args(org.springframework.transaction.annotation.Transactional)


  参数为String类型(运行是决定)的方法.
  args(String)

    

这篇文章写得不错可参考:https://www.jianshu.com/p/fbbdebf200c9

以上是关于JAVA-Spring注解实现AOP权限拦截,如何取得方法上自定义Annotation的值呢?的主要内容,如果未能解决你的问题,请参考以下文章

用户操作拦截并作日志记录--自定义注解+AOP拦截

通过AOP拦截自定义注解实现相应的功能处理

Spring AOP中@Aspect拦截介绍(二)

拦截器和自定义注解@interface

SpringBoot AOP注解式拦截与方法规则拦截

Spring aop注解方式怎么获得执行了目标的某个方法?