草庐IT

Spring AOP : Annotation on any method called x not working

coder 2023-05-12 原文

我是第一次开始使用 AOP。

我的第一个方面如下:

@Aspect
public class SyncLoggingAspect {
    private final Logger logger = Logger.getLogger(this.getClass());

    @Before("execution(public * *(..))")
    public void anyPublic() {
        System.out.println("HIT POINTCUT");
    }
}

这成功地在任何公开的方法调用上被调用。但是,当我将其更改为:

@Before("execution(public * doPoll(..))")
public void anyPublic() {
    System.out.println("HIT POINTCUT");
}

我希望它适用于任何名为“doPoll”的公共(public)方法,但是当调用这样的方法时,什么都不会发生:

public class GmailContactPoller extends ContactPoller<GoogleUser, ContactPusher<GoogleUser>> {
    Logger logger = Logger.getLogger(this.getClass());

    @Override
    public List<? extends ContactPusher<GoogleUser>> doPoll() throws PollException {
           ...
    }
}

EL 语法有什么遗漏吗?还是这与继承层次结构有关? doPoll 的父类(super class)方法在称为 Poller 的抽象类中是抽象的。没有接口(interface)会不会出问题?

编辑:我刚刚注意到我的 IDE 启用了 spring aspect 工具,现在我通过该方法收到以下编译器警告:

"描述资源路径位置类型 datasync.aop.aspects.SyncLoggingAspect 中定义的建议尚未应用 [Xlint:adviceDidNotMatch] SyncLoggingAspect.java/DataSync/src/main/datasync/aop/aspects"

最佳答案

Spring AOP Proxies 和 aspectJ 主要有一些区别:

  • Spring AOP 仅适用于公共(public)方法。
  • Spring AOP 不适用于自调用。

您可以查看sections 8.4 & 8.5 of Spring's Documentation了解更多信息。

目前你有两种解决方案:

  1. 重构您的代码以消除 self 调用的需要
  2. 在编译时或加载时使用 AspectJ 而不是 Spring AOP 代理。

关于 Spring AOP : Annotation on any method called x not working,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9126433/

有关Spring AOP : Annotation on any method called x not working的更多相关文章

  1. 【华为OD技术面试 | 真八股 】MySQL联合索引,谈springIOC的理解,谈springAOP的理解,Erika和zookeeper等问题 - 2

    文章目录华为OD面试流程1.mysql数据库建了两个字段,且设置了联合索引,如果其中有一个字段为空会出现什么问题?2.谈谈springIOC的理解,有什么好处,解决了什么问题3.谈谈springAOP的理解,切面编程有没有实际应用,有哪些注解,作用是什么,有那些应用场景?4.Erika和zookeeper有了解过吗,作用是什么,主要解决了什么问题5.谈谈JDK、JRE、JVM的理解,区别是什么6.谈谈对泛型的理解7.JVM的组成华为OD面试流程机试:三道算法题,关于机试,橡皮擦已经准备好了各语言专栏,可以直接订阅。性格测试:机试技术一面(本专栏核心)技术二面(本专栏核心)主管面试定级定薪发of

  2. SpringAop之joinPoint讲解 - 2

    一、学习背景摸鱼的时候继续复刻demo,没错,同之前一篇文章,在写aop时又发现自己对aop只停留在面试阶段,甚至还不如,完全不会实践,所以在此记录复刻aop用到的的一些且自己已经遗忘的知识。那么复刻的一个需求点我以最简单来说对于此次要学习的内容:就是通过joinPoint获取方法上的特定注解。注解代码如下:importcom.uum.common.core.enums.BusinessType;importjava.lang.annotation.*;/***自定义注解--操作日志记录*/@Documented@Target(ElementType.METHOD)@Retention(Ret

  3. SpringAop之joinPoint讲解 - 2

    一、学习背景摸鱼的时候继续复刻demo,没错,同之前一篇文章,在写aop时又发现自己对aop只停留在面试阶段,甚至还不如,完全不会实践,所以在此记录复刻aop用到的的一些且自己已经遗忘的知识。那么复刻的一个需求点我以最简单来说对于此次要学习的内容:就是通过joinPoint获取方法上的特定注解。注解代码如下:importcom.uum.common.core.enums.BusinessType;importjava.lang.annotation.*;/***自定义注解--操作日志记录*/@Documented@Target(ElementType.METHOD)@Retention(Ret

  4. Spring(十四):SpringAOP及AOP的三种实现方法 - 2

    一、什么是AOPAOP为AspectOrientedProgramming的缩写,意为:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。二、AOP的一些概念1.Aspect(切面):切面是通知和切入点的结合。2.Joinpoint(连接点):与切入点匹配的执行点,例如执行方法或处理异常。在SpringAOP中,连接点始终表示方法

  5. Spring(十四):SpringAOP及AOP的三种实现方法 - 2

    一、什么是AOPAOP为AspectOrientedProgramming的缩写,意为:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。二、AOP的一些概念1.Aspect(切面):切面是通知和切入点的结合。2.Joinpoint(连接点):与切入点匹配的执行点,例如执行方法或处理异常。在SpringAOP中,连接点始终表示方法

  6. 开发日志02-解决`response`和SpringAop层相关冲突报错问题 - 2

    解决一个Bug在昨晚的开发中遇到了一个非常令人头疼的Bugjava.lang.IllegalStateException:getOutputStream()hasalreadybeencalledforthisresponse报错信息如下:有点长。。。java.lang.IllegalStateException:getOutputStream()hasalreadybeencalledforthisresponse atorg.apache.catalina.connector.Response.getWriter(Response.java:584) atorg.apache.catali

  7. 开发日志02-解决`response`和SpringAop层相关冲突报错问题 - 2

    解决一个Bug在昨晚的开发中遇到了一个非常令人头疼的Bugjava.lang.IllegalStateException:getOutputStream()hasalreadybeencalledforthisresponse报错信息如下:有点长。。。java.lang.IllegalStateException:getOutputStream()hasalreadybeencalledforthisresponse atorg.apache.catalina.connector.Response.getWriter(Response.java:584) atorg.apache.catali

随机推荐