访问Aspect中的HttpServletRequest对象。提到的两个解决方案中哪个是更好的解决方案

西德汉特:

尝试在Aspect中获取请求对象时,我发现了两种解决方案。我想知道在性能方面哪个更好。这是详细信息。

我想对所有用'@myAnnotation'注释的方法执行myAspectMethod。因此,在我使用请求对象执行业务逻辑的地方,只要春天在方法级别找到@myAnnotation,就会执行myAspectMethod。为了得到请求,我找到了两种解决方案

  1. 在Aspect类中插入请求对象,
    如下所示

    @Aspect 
    public class MyAspect {
    @Autowired(required = true)
    **private HttpServletRequest request;**
    @Around("@annotation(myAnnotation)")
    public Object myAspectMethod(ProceedingJoinPoint pjp,  
            MyAnnotation myAnnotation) throws Throwable {
            //....do something with request object
            }
    }
    
  2. 通过在带注释的方法中将请求对象作为参数发送并通过接收到的参数列表进行访问

Aspect中的访问请求

@RequestMapping(method = { RequestMethod.GET }, value = "/something")
@MyAnnotation
public Object myAnnotatedMethod(**HttpServletRequest request**)
{
//....some business logic
}

@Aspect
public class MyAspect {
@Around("@annotation(myAnnotation)")
    public Object myAspectMethod(ProceedingJoinPoint pjp,
            MyAnnotation myAnnotation) throws Throwable {
            HttpServletRequest request = getRequestArgument(pjp);
            ....do something with request object
            }
    private HttpServletRequest getRequestArgument(ProceedingJoinPoint pjp) {
        for (Object object : pjp.getArgs()) {
            if (object instanceof HttpServletRequest) {
                return (HttpServletRequest) object;
            }
        }
        return null;
    }
}

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyAnnotation {
}
  1. 在上述两种不同的请求对象使用方式之间,从性能角度来看哪种更好?这是我想知道答案的重要问题。

  2. 每种方法的其他优点和缺点是什么。

axtavt:
  1. 我不确定第一种方法是否有效。即使您可以通过HttpServletRequest这种方式自动布线,也必须将方面设为请求范围。

  2. 我认为最好的选择是使用RequestContextHolder

    HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();
    

    该方法使用Spring已经填充的线程本地存储,不需要在方法签名中进行任何更改。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Perl中更好的Regex解决方案?

一个解决方案中具有自己视图的两个MVC项目

如何在一个解决方案中合并两个Web项目

PrefixAgainbat中的解决方案

针对“一个,其他或两个”案例的更好解决方案

java解决方案中添加两个链表导致超过时间限制

两个解决方案中均发生Nuget版本不匹配错误

[Android-解决方案]在android中同时单击两个按钮

同一ASP.NET解决方案中的两个网站

在同一解决方案中为CurrentCulture获取两个不同的值

比较R中的答案和解决方案(即比较两个表)

MySQL对两个表进行单次自动增量而不重复的更好解决方案

字典序——两个char数组作为参数,寻找更好的解决方案

Scala:更好的解决方案

衡量比较两个解决方案的执行效率?

使用两个堆栈的解决方案

两个和python解决方案

在“禁用” <a>中显示标题属性的更好解决方案

从Python列表中删除重复项的更好解决方案

更好的解决方案,而不是Java中的嵌套同步块?

ViewModel中的计时器更好的解决方案?

哪种解决方案在oracle中的性能更好?

在angularJS中向表添加行的更好解决方案

寻找更好的解决方案在pandas中创建条件列

比C ++中的dynamic_cast更好的解决方案

访问两个解决方案(C#、Async)之间的列表项

这些解决方案中的哪一个具有更好的风格/性能?

在GEKKO优化解决方案中访问特定值

在同一解决方案中访问 API