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

如果批注包含参数,则不会执行通知

丌官凯康
2023-03-14

我正在尝试获得一些执行建议。当我使用不带参数的注释时,它会执行,但当注释包含参数时,它不会执行。

@Aspect
class  a{   
    @Pointcut("execution(@com.annotations.AnnotationName* *(..))")
    void someMethod() {}

    @Around("someMethod()")
    public Object aroundSomeMethod(ProceedingJoinPoint pjp) throws Throwable
    {
    // some code
    }
}

注释:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AnnotationName
{
    public String someString();
    public boolean someBoolean();
}

注释的使用:

@AnnotationName(
        someString= "string",
        someBoolean = false
)
private void mycode()
{//code }

共有1个答案

桓修能
2023-03-14

以下方面代码将建议使用@AnNotationName注释的目标方法

@Component
@Aspect
public class SomeMethodAspect {

    @Pointcut("@annotation(annotationName) && within(so.qn69016852..*)")
    private void someMethod(AnnotationName annotationName) {}
    
    @Around("someMethod(annotationName)")
    public Object aroundSomeMethod(ProceedingJoinPoint pjp,AnnotationName annotationName) throws Throwable
    {
        System.out.println(annotationName.someString());
        System.out.println(annotationName.someBoolean());
        return pjp.proceed();
    }
}

几次修正/观察。

  1. Spring AOP不能建议Spring bean的私有方法。mycode()方法应该在bean中,最好是公共的。(参考)
  2. 方面也应该是spring bean。这可以通过使用组件注释方面来实现

请记住限制范围:https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#writing-很好的切入点

您也可以通过@kriegaex的这个答案来理解为什么@注释具有全局范围。

更新:

OP共享的代码也可以用于修改输入错误(切入点表达式中的注释名和注释之间的空格)。早些时候分享的观察结果在这里也适用。

@Component
@Aspect
public class SomeMethodAspect {

    @Pointcut("execution(@so.qn69016852.anno.AnnotationName * so.qn69016852..*.*(..))")
    private void someMethod() {}
    
    @Around("someMethod() && @annotation(annotationName)")
    public Object aroundSomeMethod(ProceedingJoinPoint pjp,AnnotationName annotationName) throws Throwable
    {
        System.out.println(annotationName.someBoolean());
        System.out.println(annotationName.someString());
        return pjp.proceed();
    }
}

 类似资料:
  • 问题内容: 以下代码运行良好: playgound_1 但是如果我改变 至 游乐场_2 我的代码无法执行。 我的直觉是在完成执行之前,某种方式会返回,但是似乎添加暂停应该没有任何效果。我对这个简单的例子完全迷失了,这是怎么回事? 问题答案: 当函数结束时,它的程序结束。它不等待其他goroutine完成。 引用Go语言规范:程序执行: 程序执行首先初始化主程序包,然后调用函数。当该函数调用返回时,

  • 问题内容: 我有这个下面的代码。 编辑: 这是被称为回调函数的函数: 现在,如果我想将变量作为参数传递给回调函数,是否有办法做到这一点而不必在调用中将其添加为另一个参数?我试图让该函数对其他用法开放,所以我不想传递任何额外的参数;但是如果它可以以某种方式包含在回调中,那就太好了。 问题答案: 将回调更改为匿名函数: 这使您可以将参数传递给内部函数。 编辑:允许ajax响应:

  • 我创建了自定义自动完成,在这里我想使用手动输入输入,并从数据库中提供选项。所以我创建了javascript代码,它从DB中获取数据并将它们放入datalist。对于第一次搜索,所有这些都很好,但我实现了分隔符,这样我就可以在输入字段中添加多个值(我希望有一个电子邮件列表)。当我的代码再次调用ajax进行下一次自动完成时,我在控制台中看到datalist中的数据已刷新,但浏览器不再显示任何数据。 代

  • 有没有人知道一个vba代码,如果a列中的任何单元格包含单词“total”,就可以删除整行?例如,A38包含“total”,则删除整行。下个月,单元格A44包含单词“total”,删除整行。诸如此类....谢谢!

  • 问题内容: 例如,需要使用 字符串找出只读取字符串中 数字 的方法, 即 我的尝试 问题答案: 试试这个: 由于返回的是文本数组,因此您应该通过来访问第一个元素。

  • 目前 我在DynamoDB中有一个表,其中有一个属性-主键-包含唯一的值。 问题 我希望对#B#C#(1)精确匹配和(2)包含匹配进行2次搜索,因此只需要结果: 是否可以针对主键进行这2次搜索 如果是这样,运行哪种查询最有效?e、 g.查询或扫描 注: 对于(2),我使用以下代码,但它返回DB中的所有项: