aop拦截注解,JAVASpring注解实现AOP权限拦截如何取得方法上自定义

1 , JAVASpring注解实现AOP权限拦截如何取得方法上自定义主要问题在于不同的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,就会进入此区域 。第一种:注解配置aop注解配置aop(使用 aspectj 类库实现的) , 大致分为三步: 1. 使用注解@aspect来定义一个切面,在切面中定义切入点(@pointcut),通知类型(@before, @afterreturning,@after,@afterthrowing,@around). 2. 开发需要被拦截的类 。3. 将切面配置到xml中,当然,我们也可以使用自动扫描bean的方式 。这样的话 , 那就交由spring aop容器管理 。另外需要引用 aspectj 的 jar 包: aspectjweaver.jar aspectjrt.jar
2,Spring AOP 拦截 RequestMapping 注解下的方法用request.getMethod()可以判断是GET还是POST【aop拦截注解,JAVASpring注解实现AOP权限拦截如何取得方法上自定义】
3,Spring aop 注解方式怎么获得执行了目标的某个方法private void beforeTransationHandle(JoinPoint point) throws Exception//拦截的实体类Object target = point.getTarget();//拦截的方法名称String methodName = point.getSignature().getName();//拦截的方法参数Object[] args = point.getArgs();//拦截的放参数类型Class[] parameterTypes = ((MethodSignature)point.getSignature()).getMethod().getParameterTypes();Method m = null;try//通过反射获得拦截的methodm = target.getClass().getMethod(methodName, parameterTypes);//如果是桥则要获得实际拦截的methodif(m.isBridge())for(int i = 0; i < args.length; i++)//获得泛型类型Class genClazz = GenericsUtils.getSuperClassGenricType(target.getClass());//根据实际参数类型替换parameterType中的类型if(args[i].getClass().isAssignableFrom(genClazz))parameterTypes[i] = genClazz;}}//获得parameterType参数类型的方法m = target.getClass().getMethod(methodName, parameterTypes);}} catch (SecurityException e)e.printStackTrace();} catch (NoSuchMethodException e)e.printStackTrace();}}
4,Spring AOP中Aspect拦截介绍一本章介绍的@Aspect拦截用的非注解方式,而是通过切入点@Pointcut指定要拦截的目录,本章节实现了拦截请求和返参后对其进行修改,类似于过滤器的作用User.javaAspectTestController.javaTestAspect.java如果想要学习或者加上该封装结构,可以在笔者的项目笔记目录下寻找“项目返参结构封装”就可以直接复制了,当然也可以自己返回一个String或者Object类型先测试用着本测试例子中已经把 @Before和@After和@AfterReturning注掉了 , 只使用的@Around,可以直接用postman调用测试的 , 测完还可以放开前面三个注解,再把@Around注掉再测就可以了 。无参的那个测试不能用@Around测试,想要用@Around测试需要改一下,@Around("pointCut() && args(arg)")改为@Around("pointCut() "),下面的入参和修改参数部分去掉即可5,Spring AOP 拦截 RequestMapping 注解下的方法用request.getMethod()可以判断是GET还是POST创建拦截类:@aspectpublic class myaspect/** 执行前拦截 */@before("execution(* t.t..service.*service.*(..))")public void before(joinpoint point) throws throwablesystem.out.println("执行方法:" + point.getsignature().getdeclaringtypename() + "." + point.getsignature().getname());}/** 执行后拦截 */@after("execution(* t.t..service.*service.*(..))")public void after(joinpoint point) throws throwablesystem.out.println("执行完成:" + point.getsignature().getdeclaringtypename() + "." + point.getsignature().getname());}/** 执行前后拦截(环绕) */@around("execution(* cn.cydl.dlj..service.*service.*(..))")public object around(proceedingjoinpoint point) throws throwablesystem.out.println("执行前...");// 这里相当于@beforeobject obj = point.proceed();// 调用方法具体执行过程,如果不调用,这原来的方法就不会执行了// obj问原来的方法返回值,如果不返回obj,则原来的方法即时有r...创建拦截类:@aspectpublic class myaspect/** 执行前拦截 */@before("execution(* t.t..service.*service.*(..))")public void before(joinpoint point) throws throwablesystem.out.println("执行方法:" + point.getsignature().getdeclaringtypename() + "." + point.getsignature().getname());}/** 执行后拦截 */@after("execution(* t.t..service.*service.*(..))")public void after(joinpoint point) throws throwablesystem.out.println("执行完成:" + point.getsignature().getdeclaringtypename() + "." + point.getsignature().getname());}/** 执行前后拦截(环绕) */@around("execution(* cn.cydl.dlj..service.*service.*(..))")public object around(proceedingjoinpoint point) throws throwablesystem.out.println("执行前...");// 这里相当于@beforeobject obj = point.proceed();// 调用方法具体执行过程,如果不调用,这原来的方法就不会执行了// obj问原来的方法返回值,如果不返回obj,则原来的方法即时有return也不会返回任何值// 这里相当于@aftersystem.out.println("执行后...");return obj;}}

    推荐阅读