【问题标题】:Spring AOP loggingSpring AOP 日志记录
【发布时间】:2018-04-13 00:25:08
【问题描述】:

我有一个在 Spring 框架上运行的 j2ee Web 应用程序。我想使用 log4j 和 Spring 的 AOP 实现日志记录。我能够使用自定义注释记录公共方法。我无法使用自定义注释记录私有方法。任何人都可以参考如何为私有方法实现自定义注释。

【问题讨论】:

    标签: spring-boot logging aop aspectj spring-aop


    【解决方案1】:

    Spring AOP

    Spring AOP 不支持私有方法的拦截。

    11. Supported Pointcut Designators

    由于 Spring 的 AOP 框架基于代理的特性,目标对象内的调用根据定义不会被拦截。对于 JDK 代理,只能拦截代理上的公共接口方法调用。使用 CGLIB,代理上的公共和受保护的方法调用将被拦截,必要时甚至包可见的方法。但是,通过代理的常见交互应始终通过公共签名进行设计。 请注意,切入点定义通常与任何拦截的方法匹配。如果切入点严格来说是只公开的,即使在 CGLIB 代理场景中,通过代理进行潜在的非公开交互,也需要相应地定义它。 如果您的拦截需求包括目标类中的方法调用甚至构造函数,请考虑使用 Spring 驱动的原生 AspectJ 编织,而不是 Spring 的基于代理的 AOP 框架。这就构成了不同特性的AOP使用模式不同,所以在做决定之前一定要先熟悉编织。

    AspectJ 源编织

    您可以利用 AspectJ 源代码编织来拦截 私有 方法。 Here 是一个完整的工作示例。

    【讨论】:

    • 我正在搜索 Spring 驱动的原生 AspectJ 编织示例,但我找不到正确的示例。
    • 我可以运行该示例,但是当从公共方法调用私有方法时,@before 注释不起作用。
    • 我的例子是调用private 方法。请查看我的示例中的pom.xml,了解如何使用 maven aspect 插件。另请参阅我的answer 来自一个非常相似的问题。
    • 当我使用 maven aspect 插件时,它在执行标签附近抛出错误。
    • 将异常堆栈粘贴到您的帖子中。
    猜你喜欢
    • 2012-11-04
    • 2012-09-30
    • 1970-01-01
    • 1970-01-01
    • 2015-06-09
    • 2011-08-12
    • 2012-09-12
    • 2015-11-22
    • 2011-04-05
    相关资源
    最近更新 更多