Spring AOP implements MethodInterceptor 要怎么传参数进来

Spring AOP implements MethodInterceptor 要怎么传参数进来,第1张

是这样的 一般aop的处理 都是以调用链的形式处理的、

Java代码

RemoteInvocation invocation = new RemoteInvocation();

invocationsetMethodName(tgetMethod()getName());

invocationsetParameterTypes(tgetMethod()getParameterTypes());

invocationsetArguments(tgetArguments());

invocationaddAttribute(

>

目标人群 :Java开发者

本文目标 :通过AOP注解占位符,匹配目标方法参数,可用于日志记录等场景

阅读时间 :2 分钟

重点关注: annotationResolver()方法为核心注解解析方法

通过注解中的“ ${d} ”占位符,匹配方法参数列表,实现动态参数的注入。

执行结果:

title: Spring之AOP二

date: 2017-03-25 02:42:16

tags:

execution

日常使用最多的标识符,使用execution标识符的Pointcut表达式格式:

within

指定类型,类型下所有方法。可以使用 和 扩展,like: within(tkzhanghspring)

this和target

Spring中使用this和target实际作用类似

args

指定参数类型,指定参数数量

与execution标识符不同,args标识符会在运行期间动态检查参数类型

@within

指定类型,类型下的所有方法,要求类型标记了指定注解,like:

@target

指定标记了给定注解类型的目标对象的所有方法

@args

指定参数类型,要求参数参数类型标记了指定注解

@annotation

指定标记了指定注解的方法,@Transctional的实现方式

所有@AspectJ形式声明的这些Pointcut表达式最终都会转化成Pointcut的具体实现。

AspectJExpressionPointcut如同他的名字面向AspectJ的pointcut实现,整个继承体系:

使用@Aspect注解标记的类中,具体的Advice形式由具体的Advice注解标示。

注解的方法中需要访问上下文信息最主要的方式:将方法的第一个参数声明为JoinPoint类型

以事务为例,事务管理也是使用AOP,具体是@annotation形式的Pointcut声明(这样我就不用声明Advice了)

当在aFun内调用bFun时事务没有开启,也就是AOP没有生效,原因:

我们期望虚线的调用方式,实际上调用时红色的路线,添加在代理对象上的AOP逻辑在嵌套调用时根本没有机会触发。在事务处理时尤其要注意避免这样的嵌套调用问题。

解决:

不管是那种方式都要注入相关Bean,具体那种更优雅由你来决定了。

由于在项目中controller层频繁用到log打印入参和回参以及入参的DTO校验,存在很多的重复 *** 作。

最近了解到了aop相关的知识,决定写一个切面来替代这些重复 *** 作。

因为我这里是spring boot 项目,所以加入依赖:

创建自定义注解@BeanValidated:

创建切面处理类:

使用@Slf4j注解需要导入lombok注解,以及在idea中开启lombok,或者也可以自己获取logger

运用切面还可以完成权限验证等功能,大家可以自己试着写一下。

链接: >

过滤器是服务端的一个组件,是基于servlet实现从客户端访问服务端web资源的一种拦截机制,对请求request和响应response都进行过滤,依赖于serverlet容器,使用时,实现Filter接口,在webxml里配置对应的class还有mapping-url。

拦截器,顾名思义,它的作用就是拦截,这个要和过滤器区分开,过滤器依赖serverlet容器,获取request和response处理,是基于函数回调(框架本身调用的,它会遍历所有注册的过滤器,并且一一调用doFilter()),简单说就是“去取你想取的”。拦截器是通过Java反射机制来拦截web请求,是“拒你想拒绝的”,它只拦截web请求,但不拦截静态资源。

拦截器,在AOP中用于在某个方法或字段被访问之前,进行拦截,然后在之前或之后加入某些 *** 作。拦截是AOP的一种实现策略。

相比过滤器,拦截器能够知道用户发出的请求最终被哪个控制器处理,但是拦截器还有一个明显的不足,即不能够获取request的参数以及控制器处理之后的response。(注意 ,我曾经试过,获得被拦截方法的一些参数,但是通过methodParaters无法获得,后来只能通过requestgetParameter()来获取)所以就有了切片的用武之地了。

Filter与Interceptor的区别

Interceptor 与spring AOP的区别

// 环绕通知

@Around("anyMethod() && args(id)")

public Object Around(ProceedingJoinPoint pjp, Integer id) throws Throwable {

Object result = null;

if (id == 4) {

Systemoutprintln(id);

result = pjpproceed();

} else {

result = "我被改变了";

}

return result;

}

这是切面中环绕通知的一个方法。其中一个pjpproceed()方法个人理解为是一个对业务方法的模拟,可是在这个方法前后插入想做的事情。

以上就是关于Spring AOP implements MethodInterceptor 要怎么传参数进来全部的内容,包括:Spring AOP implements MethodInterceptor 要怎么传参数进来、spring 中的aopbefore执行的方法的参数是基本的数据类型该怎么定义、AOP 注解动态注入参数等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9536266.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-29
下一篇2023-04-29

发表评论

登录后才能评论

评论列表(0条)

    保存