gpt4 book ai didi

java - Guice 中基于 AOP 的日志记录

转载 作者:行者123 更新时间:2023-11-30 06:52:39 25 4
gpt4 key购买 nike

我正在尝试在 Google - Guice 中实现基于 AOP 的日志记录。我为此使用了 MethodInterceptor 但它不起作用。我在 Spring 中通过定义切入点来使用相同的方法。那里一切都工作正常。

基于 AOP 的日志记录的 Spring 代码 -

@Aspect
public class LoggingAspect {

private static Logger logger = LoggerFactory.getLogger(LoggingAspect.class);

@Around("requiredLog()")
public Object bentoBoxAround(ProceedingJoinPoint proceedingJoinPoint) {

Object returnValue = null;
try {

logger.info("Entered into the method -> " + proceedingJoinPoint.getSignature().toShortString()
+ " and input arguments are -> " + Arrays.asList(proceedingJoinPoint.getArgs()));
returnValue = proceedingJoinPoint.proceed();
logger.info("Method Execution over !! " + proceedingJoinPoint.getSignature().toShortString());
} catch (Throwable e) {
logger.error("Method has an exception " + e.getMessage());
}
return returnValue;
}

@Pointcut("within(org.cal.bento..*)")
public void allRequiredPakageLog() {
}

}

从上面的代码中,我们可以记录 org.cal.bento.* 包内的所有类和方法执行。

基于 AOP 的日志记录的 Guice 代码 -

public class GuiceLoggingInterceptor implements MethodInterceptor {

private static Logger logger = LoggerFactory
.getLogger(GuiceLoggingInterceptor.class);

@Override
public Object invoke(MethodInvocation invocation) throws Throwable {
Object returnValue = null;
try {
logger.info("GUICE - Entered into the method -> " + invocation.getMethod().getName()
+ " and input arguments are -> " + Arrays.asList(invocation.getArguments()));
returnValue = invocation.proceed();
logger.info("Method Execution over !! " + invocation.getMethod().getName());
} catch (Throwable e) {
logger.error("GUICE - Method has an exception " + e.getMessage());
}
return returnValue;
}
}

绑定(bind)类 -

public class GuiceAopModule extends AbstractModule {

@Override
protected void configure() {
bindInterceptor(Matchers.any(), Matchers.any(), new GuiceLoggingInterceptor());
}
}

我们可以在 Guice 中做类似的日志记录吗(通过为整个日志系统仅定义一个基于 Aspect 的类)。我不想修改每个类。

引用教程 - https://schakrap.wordpress.com/2009/07/30/method-entry-exit-logging-in-guice-with-aop/

任何帮助将不胜感激。

最佳答案

您的问题似乎是您没有使用 guice 进行创建。来自 guice 文档:

This approach imposes limits on what classes and methods can be intercepted:

[...]

Instances must be created by Guice by an @Inject-annotated or no-argument constructor It is not possible to use method interception on instances that aren't constructed by Guice.

所以这意味着,因为您的实例是由 spring 创建的,并且可能添加到 guice,所以 guice 没有机会代理这些类进行拦截。

来源:

https://github.com/google/guice/wiki/AOP

编辑:

为了使这项工作顺利进行,您可以采取的措施(作为解决方法)是:

  1. Spring 创建您的实例。

  2. 将它们放入guice中

  3. 创建一个由 Guice 创建的委托(delegate)对象,并将 (1) 的 bean 注入(inject)到包装器中。

  4. 使用包装器而不是1中的对象,然后方法将被拦截。

关于java - Guice 中基于 AOP 的日志记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38566288/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com