【问题标题】:Spring AOP: exchanging information between methodsSpring AOP:在方法之间交换信息
【发布时间】:2020-09-27 17:38:41
【问题描述】:

假设我有一个名为MyServlet 的类,其目的是响应用户请求:

@Component
public class MyServlet
{
    public void accept(String clientName, int clientID)
    {
        System.out.println("Processing client:" + clientName + " with ID: " + clientID);
    }
}

一般来说,在尝试调试我们的应用程序之前,我们可能希望记录用户的请求。所以如果我能在accept() 被调用之前透明地发生这种行为,我真的很高兴。对于这个人,Helper 类可以提供日志功能,我们将用@Before 装饰:

@Aspect
@Component
@EnableAspectJAutoProxy
public class Helper
{
    @Before("execution(public void show())")
    public void log()
    {
        System.out.println("Logging data...");
    }
}

但如果能够获取提供给accept()(在本例中为Stringint)的信息并将其传递给log(),这对我来说非常有用,因为它将允许我将用户及其 ID 准确地记录到我使用的任何日志存储中。我怎样才能做到这一点?

【问题讨论】:

  • (1) @EnableAspectJAutoProxy 应该在单独的 @Configuration 类上,而不是在 @Component 上。 (2) 您的切面拦截了show(),但您的示例方法名为accept(String, int)。所以我对你想要达到的目标感到困惑。代码本身不会说话。所以请更新问题,然后在此处发表评论通知我们。

标签: java spring aop spring-aop cross-cutting-concerns


【解决方案1】:

您可以通过注入JoinPoint 实例并在其上调用getArgs() 方法来访问代理方法的参数。下面是 sn-p 示例。

@Before("execution(* com.sample.SomeClass.doSometning(..))")
public void doSomethingBefore(JoinPoint joinPoint) {
   Object[] args = joinPoint.getArgs();
   for (Object arg: args) {
       // do whatever you like with the arguments
   }
}

【讨论】:

    猜你喜欢
    • 2013-08-10
    • 2010-09-30
    • 1970-01-01
    • 1970-01-01
    • 2018-03-14
    • 2021-02-01
    • 2017-05-24
    • 2013-06-21
    相关资源
    最近更新 更多