当前位置: 首页 > 知识库问答 >
问题:

Spring AOP自定义注释,使用注释参数获取Null

颛孙正谊
2023-03-14
@Around("@annotation(logExecutionTime) || @within(logExecutionTime)")
public Object logExecutionTime(ProceedingJoinPoint joinPoint, LogExecutionTime logExecutionTime) throws Throwable {
    final Logger logger = LoggerFactory.getLogger(joinPoint.getTarget().getClass());

    final String name = joinPoint.toShortString();
    final StopWatch stopWatch = new StopWatch(name);

    stopWatch.start(name);
    try {
      return joinPoint.proceed();

    } finally {
      stopWatch.stop();
      if (logExecutionTime.value()) {
        logger.info(joinPoint.getSignature().getName() + ".time=", stopWatch.getTotalTimeSeconds());
      }
    }
  }
@Around("@within(logExecutionTime) || @annotation(logExecutionTime)")
@Around("@within(logExecutionTime)")
public Object logExecutionTimeClassLevel(ProceedingJoinPoint joinPoint, LogExecutionTime logExecutionTime) throws Throwable {
    return logExecutionTimeMethodLevel(joinPoint, logExecutionTime);
  }

@Around("@annotation(logExecutionTime)")
public Object logExecutionTimeMethodLevel(ProceedingJoinPoint joinPoint, LogExecutionTime logExecutionTime) throws Throwable {
    final Logger logger = LoggerFactory.getLogger(joinPoint.getTarget().getClass());

    final String name = joinPoint.toShortString();
    final StopWatch stopWatch = new StopWatch(name);

    stopWatch.start(name);
    try {
      return joinPoint.proceed();

    } finally {
      stopWatch.stop();
      if (logExecutionTime.value()) {
        logger.info(joinPoint.getSignature().getName() + ".time=", stopWatch.getTotalTimeMillis());
      }
    }

班级水平

@LogExecutionTime
@Component
public class CleanUpService implements ICleanUpService { ... }

方法

@Scheduled(fixedDelay = 100)
@LogExecutionTime(false)
public void processMessageQueue() { ... }

共有1个答案

周宏胜
2023-03-14

我来运行您的示例,并复制与您的示例相同的示例,当涉及到运行时表达式时,这是同样奇怪的,因为当您在类级别上指定注释时,您编写了这个表达式

@Around(" @within(logExecutionTime) || @annotation(logExecutionTime) ")

对于您的类,点剪切将计算为true(您注释的事件在joinpoint.gettarget().getclass().getAnnotations()中可用)

现在,当涉及到绑定变量时,编译器检查所有表示将@intern(logExecutionTime)绑定到变量logExecutionTime和@annotation(logExecutionTime)绑定到同一变量的表达式,如果该方法没有被注释,它将ge null,=>重写初始with,这将导致您提到的所有senarios。

 类似资料:
  • 在执行通知时,如何获取的和?我正在使用Spring 4.0.6、AspectJ 1.7.4

  • 我发现了几个与此相关的(不是重复的)问题,但它们不能让我满意。 我无法理解在哪里以及为什么要使用? 我在一本书中读到了一个自定义注释的示例,但没有详细解释。 myMeth()内的输出与预期一致。 关于这个例子,我有几个问题。 1-如何在此程序中使用和?或

  • 我正在尝试使用Spring安全注释,如@PreAuthorize和@安全,但我希望评估用户不是在一个角色上,而是他们是否拥有对特定实体的权限,在这种情况下是一家公司。在我的控制器中,我收到一个超文本传输协议请求,其中包含一个firmId作为参数,我想确保这个用户被允许进入这家公司。是否可以使用当前的Spring安全注释?。我正在寻找一个优雅的解决方案,我一直在寻找自定义约束验证器作为jsr303规

  • 在我的方面方法中,我需要获取name(自定义注释的参数)的值 由用户调用的方法:

  • 问题内容: 我为我写了一个 对于每个我使用以下注释 因此,我决定定义自己的注释女巫,其中包含所有这样的注释 然后,我只用了一个注释 修改后,测试失败 为了使其再次工作,需要我将其添加到 我的问题是为什么我的注释包含注释时不起作用?注释有什么特别之处吗?还是我错过了什么? PS:我使用相同的方法,它们也很好用。 问题答案: 这种机制是Spring框架特有的,在这种机制中,您可以使用本身带有其他注释的

  • 使用 Vim 编辑 Shell 脚本,在进行调试时,需要进行多行的注释,每次都要先切换到输入模式,在行首输入注释符"#"再退回命令模式,非常麻烦。 连续行的注释其实可以用替换命令来完成。换句话说,在指定范围行加"#"注释,可以使用 ":起始行,终止行 s/^/#/g",例如: :1,10s/^/#/g 表示在第 1~10 行行首加"#"注释。"^"意为行首;"g"表示执行替换时不询问确认。如果希望