0

我正在尝试将 AspectJ 记录到模块以更好地分析它。我的应用程序已经在使用 log4J 框架。
如果我在单独的应用程序中运行 AspectJ 类,它可以正常工作,但是当我将它与应用程序集成时它就不起作用了。这是我所做的
applicationContext.xml

<aop:aspectj-autoproxy/>
<bean id="logAspectj" class="com.test.aspect.LoggingAspect"/>

LoggingAspect 类

@Component
@Aspect
public class LoggingAspect {

    private final Log log = LogFactory.getLog(this.getClass());

    @Around("execution(public void com.db.TestMarshaller.saveDoc(..))")
    public Object logTimeMethod(ProceedingJoinPoint joinPoint) throws Throwable {

            StopWatch stopWatch = new StopWatch();
            stopWatch.start();

            Object retVal = joinPoint.proceed();

            stopWatch.stop();

            StringBuffer logMessage = new StringBuffer();
            logMessage.append(joinPoint.getTarget().getClass().getName());
            logMessage.append(".");
            log.info(logMessage.toString());
            return retVal;
    }

}

注意:这里的 TestMarshaller 没有通过 Spring 公开。

Log4j 是否有一些特定的 AspectJ 设置?

4

1 回答 1

1

由于您的 com.db.TestMarshaller 不是“spring managed”(在您的上下文中没有该类型的 Spring bean),因此使用的 spring 命名空间不会创建调用您的 Aspect 的代理。

在这种情况下,您要么必须使用 AspectJ 编译器(编译时编织)编译源代码,要么在加载类时使用 aspectj 运行时修改字节码(加载时编织)。

这实际上取决于您的用例,如果您的 Aspect 是您的业务逻辑的一部分并且在运行时无法更改,请使用 aspectj 编译器,因为它只会执行一次。如果您需要更动态的方面应用程序,请改用加载时间编织。

希望这会有所帮助, Jochen

于 2012-08-17T10:53:08.177 回答