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应该怎么获取?
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的值呢?的主要内容,如果未能解决你的问题,请参考以下文章