我正在使用 spring 3.0.6。我的应用程序有很多地方添加了日志记录(slf4j)。假设我需要为每个严重错误添加一些函数 - 对我来说最好能捕捉到对 的每次调用。错误级别日志记录 并在它之后做可能的工作 - 发送邮件以支持异常消息,或类似的东西 - 而不是手动将代码添加到应用程序中的所有位置。
我创建了以下类(class):
@Aspect
public class LoggingWrapper {
@Pointcut("execution (* org.slf4j.Logger.error(..))")
public void logError() {
}
@AfterReturning("logError()")
public void afterError() {
//System.out.println("LOGERROR ASPECT AFTER");
//send email...
}
}
在 Spring 配置中:
<aop:aspectj-autoproxy />
<bean id="loggingWrapper" class="com.app.services.LoggingWrapper"/>
Aspect 在我的类(class)中运行良好,但对于 org.slf4j.Logger - 什么都没有发生
最佳答案
@crudo6,这不适用于使用代理的 Spring @AspectJ 支持 - 原因是 Spring 处理 @AspectJ 注释的方式是创建代理,例如。如果您 @Around
给您的建议 @PointCut("execution (for your class)")
,那么 Spring 将为 中的所有 bean 创建代理。 Spring 上下文 具有与切入点中的类匹配的类型。
现在,由于 slf4j 类不是 Spring 上下文的一部分,因此不会为它们创建代理,您的方面也不会生效。
为了让它们工作,你可以尝试加载时编织或编译时编织并使用 '@Pointcut("call (* org.slf4j.Logger.error(..))")' 而不是执行,这样任何调用到 SLF4J 可以被你的意见拦截。 @Pointcut of execution 将需要编织 slf4j 库,这可能是不可能的。
关于使用 slf4j 进行日志记录的 spring aspectj 切入点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9783828/