【发布时间】:2018-04-13 00:25:08
【问题描述】:
我有一个在 Spring 框架上运行的 j2ee Web 应用程序。我想使用 log4j 和 Spring 的 AOP 实现日志记录。我能够使用自定义注释记录公共方法。我无法使用自定义注释记录私有方法。任何人都可以参考如何为私有方法实现自定义注释。
【问题讨论】:
标签: spring-boot logging aop aspectj spring-aop
我有一个在 Spring 框架上运行的 j2ee Web 应用程序。我想使用 log4j 和 Spring 的 AOP 实现日志记录。我能够使用自定义注释记录公共方法。我无法使用自定义注释记录私有方法。任何人都可以参考如何为私有方法实现自定义注释。
【问题讨论】:
标签: spring-boot logging aop aspectj spring-aop
Spring AOP 不支持私有方法的拦截。
由于 Spring 的 AOP 框架基于代理的特性,目标对象内的调用根据定义不会被拦截。对于 JDK 代理,只能拦截代理上的公共接口方法调用。使用 CGLIB,代理上的公共和受保护的方法调用将被拦截,必要时甚至包可见的方法。但是,通过代理的常见交互应始终通过公共签名进行设计。 请注意,切入点定义通常与任何拦截的方法匹配。如果切入点严格来说是只公开的,即使在 CGLIB 代理场景中,通过代理进行潜在的非公开交互,也需要相应地定义它。 如果您的拦截需求包括目标类中的方法调用甚至构造函数,请考虑使用 Spring 驱动的原生 AspectJ 编织,而不是 Spring 的基于代理的 AOP 框架。这就构成了不同特性的AOP使用模式不同,所以在做决定之前一定要先熟悉编织。
您可以利用 AspectJ 源代码编织来拦截 私有 方法。 Here 是一个完整的工作示例。
【讨论】:
private 方法。请查看我的示例中的pom.xml,了解如何使用 maven aspect 插件。另请参阅我的answer 来自一个非常相似的问题。