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

超类中带有自定义注释的AOP不起作用

米迪
2023-03-14

自定义注释

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface CustomAnnotation {
}

自定义注释处理程序

@Aspect
public class TestAspectHandler {
    @Around("execution(@com.test.project.annotaion.CustomAnnotation * *(..)) && @annotation(customAnnotation)")
    public Object testAnnotation(ProceedingJoinPoint joinPoint, CustomAnnotation customAnnotation) throws Throwable {
        System.out.println("TEST");
        return result;
    }
}

超级类

public class AbstractDAO {
     @CustomAnnotation
     protected int selectOne(Object params){
          // .... something
     }
}

子类

public class SubDAO extends AbstractDAO {
    public int selectSub(Object params) {
         return selectOne(params);
    }
}

SubclassSubDAO调用SuperClass方法selectOne但在TestAspectHandler.class不调用testAnnoation(…)

当我将@CustomAnnotation移动到子类selectSub(..)method时,AspectHandler可以获取

如何在超类保护方法中使用自定义注释?

已添加

更改 TestAspectHandler.test 注释(...) 方法

@Around("execution(* *(..)) && @annotation(customAnnotation)")
public Object testAnnotation(ProceedingJoinPoint joinPoint, CustomAnnotation customAnnotation) throws Throwable {
            System.out.println("TEST");
            return result;
}

但还是不行

所以我把我的< code >子DAO改成了under code

public class SubDAO extends AbstractDAO {
    @Autowired
    private AbstractDAO abstractDAO;
    public int selectSub(Object params) {
         return abstractDAO.selectOne(params);
    }
}

这不是完美的解决方案,但它的工作原理

  • 情况1:从子类方法调用超类方法不起作用
  • 情况 2:使超级类实例和从实例调用工作

共有2个答案

鲍飞星
2023-03-14

它的工作方式是,您的Spring豆代理(对Spring豆的每个引用实际上都是委托给 Bean 实例的代理)为您应用的方面创建 JDK Dynamoc 代理(用于实现至少 1 个接口或 CGLib 代理的类)。因此,当调用 selectSub 方法时,它已经通过了Spring豆委托,并且无法应用该方面。如果你想让它工作,你也必须注释子方法。

施俊明
2023-03-14

首先,我希望你的DAO类是实际的Spring组件,否则SpringAOP找不到它们,只有AspectJ可以找到。

但是在它的核心,这不是一个Spring或AspectJ的问题。在Java中,注释

    < li >接口, < li >其他注释或 < li >方法

永远不会被继承

  • 实现类,
  • 使用注释或
  • 的类
  • 重写方法

注释继承仅适用于从类到子类,但仅当超类中使用的注释类型包含元注释@Inherited时,请参阅JDK JavaDoc。

因为我之前已经回答过这个问题几次了,所以我刚刚记录了这个问题以及AeyJ接口和方法的模拟注释继承中的解决方法。

更新:抱歉,我刚刚更彻底地检查了你的代码。您没有覆盖超类的带注释的方法(至少您的代码没有显示您覆盖了方法< code>selectOne),所以我上面描述的不适用于这里。你的相位会起作用。但也许您只是在完全限定的类名< code > @ com . test . project . annotation . custom annotation 中有一个拼写错误:< code > annotation (注意这个拼写错误!)包名应该是< code>annotation。正如我在第一句话中所说的:Dao必须是Spring @Component的。

顺便说一句:您可以完全避免切入点的这一部分,因为您已经将注释绑定到参数。只需使用

@Around("execution(* *(..)) && @annotation(customAnnotation)")
 类似资料:
  • 我看了堆栈交换和Spring示例网站上的每个示例,一切似乎都应该有效。我一定错过了一些简单的东西 我有一个自定义注释,理想情况下,如果类被注释,我希望将其应用于类的所有方法,或者应用于任何注释的方法。以下是方面、测试和代码: 注释 方面 测验 后果 链接 实际来源

  • 我正在尝试创建一个带有自定义注释和spring AOP的Spring Boot库。当我将这个库与新的spring boot应用程序一起使用时。那么它就不起作用了。就连我也没有任何错误。 库示例- 自定义注释 SpringAOP课程 波姆。xml 使用mvn clean install创建库 现在,新的库被导入到springboot应用程序中。 控制器中使用了新的自定义注释 控制器 请帮忙。

  • 现有的答案很好地解释了如何在方法执行时间日志中使用自定义注释。我想知道是否有办法对类和方法使用相同的注释,但是点切应该在使用它的地方有所不同。 若注释用于类,那个么类中的所有方法都应该考虑在方面类中记录执行时间(比如

  • 我已经用自定义注释注释了Spring bean,但似乎Spring在创建bean后删除了我的自定义注释。 第二步不行,我的自定义注释丢失了。(可能是到期的代理文件) 我的豆子 我的一个自定义注释的示例 findAndDoStuffWithAnnotatedThings Bean中出错的内容被传递到一个类,在该类中,我的自定义注释得到验证,但我的验证程序找不到任何注释。(Util使用isAnnota

  • 我目前正在开发一个尽可能尊重六边形架构原则的应用程序。 因此,我的“域”模块(组Id: ; 工件Id:)不依赖于任何技术框架。 我的所有服务都使用自定义注释(本身是我域的一部分)进行注释: 然而,在我的“Quarkus应用”模块(groupId:< code > acme ;artifact id:< code > app-quar kus ,我需要注入我的“域”模块中定义的服务(< code>a

  • 我有一个名为的下拉字段,其中包含电话、电子邮件等值,还有一个名为的输入字段。如果选择了下拉值,我想验证输入字段的有效电子邮件地址。。。 我试图创建一个自定义约束,将验证字段对电子邮件正则表达式,如果字段将具有值 我有以下自定义约束的代码 验证器就像 问题是它没有在表单上触发...我使用模型对话框,其中要验证的bean被呈现 参考:使用Hibernate验证器进行跨域验证(JSR 303) 期待您的