在 guice 应用程序中使用为 spring 应用程序编写的方面
Use an aspect written for spring application in guice application
我使用类似于以下方面的 Spring AOP/AspectJ 注释将方面作为应用程序的一部分编写:
@Aspect
@Component
public class LoggingAspect {
@Around("@annotation(loggable)")
public Object log(final ProceedingJoinPoint joinPoint, final Loggable loggable) throws Throwable {
//log method arguments
try {
Object returnValue = joinPoint.proceed();
// log return value
return returnValue;
} catch (Exception ex) {
// publish exception metrics to some other system
throw ex;
}
}
}
现在我想在另一个项目中使用相同的方面,但是这个项目使用 Guice 而不是 Spring。
我正在阅读有关 Guice AOP 的内容,它需要方面来实现 MethodInterceptor 接口,因此我需要实现以下方法:
Object invoke(MethodInvocation methodInvocation) throws Throwable;
我的想法是修改已经存在的方面来实现MethodInterceptor并在内部调用日志方法。如下所示:
@Aspect
@Component
public class LoggingAspect implements MethodInterceptor {
@Override
public Object invoke(MethodInvocation methodInvocation) throws Throwable {
// call already defined log method, but that method expects a ProceedingJoinPoint, however
// I get MethodInvocation as input parameter in this method
}
// already defined log method
@Around("@annotation(loggable)")
public Object log(final ProceedingJoinPoint joinPoint, final Loggable loggable) throws Throwable {
......
.....
}
但是由于两种方法之间的类型不兼容,我无法继续。
有没有一种方法可以重用现有代码,而不用编写带有重复代码的全新方面来支持 Guice?
如果我没理解错的话,你想反转控制流,这可以通过回调来完成。
@Aspect
@Component
class LoggingAspect implements MethodInterceptor {
@Around("@annotation(loggable)")
public Object log(final ProceedingJoinPoint joinPoint, final Loggable loggable) throws Throwable {
return log(joinPoint::getArgs, () -> joinPoint.proceed(joinPoint.getArgs()));
}
@Override
public Object invoke(MethodInvocation methodInvocation) throws Throwable {
return log(methodInvocation::getArguments, methodInvocation::proceed);
}
public Object log(Supplier<Object[]> arguments, Supplier<Object[]> proceed) {
Object[] args = arguments.get();
//log method arguments
try {
Object returnValue = proceed.get();
// log return value
return returnValue;
} catch (Exception ex) {
// publish exception metrics to some other system
throw ex;
}
}
}
顺便说一句,你是故意只抓住 Exception
而不是 Throwable
吗? Error
s 不会被记录。
我使用类似于以下方面的 Spring AOP/AspectJ 注释将方面作为应用程序的一部分编写:
@Aspect
@Component
public class LoggingAspect {
@Around("@annotation(loggable)")
public Object log(final ProceedingJoinPoint joinPoint, final Loggable loggable) throws Throwable {
//log method arguments
try {
Object returnValue = joinPoint.proceed();
// log return value
return returnValue;
} catch (Exception ex) {
// publish exception metrics to some other system
throw ex;
}
}
}
现在我想在另一个项目中使用相同的方面,但是这个项目使用 Guice 而不是 Spring。
我正在阅读有关 Guice AOP 的内容,它需要方面来实现 MethodInterceptor 接口,因此我需要实现以下方法:
Object invoke(MethodInvocation methodInvocation) throws Throwable;
我的想法是修改已经存在的方面来实现MethodInterceptor并在内部调用日志方法。如下所示:
@Aspect
@Component
public class LoggingAspect implements MethodInterceptor {
@Override
public Object invoke(MethodInvocation methodInvocation) throws Throwable {
// call already defined log method, but that method expects a ProceedingJoinPoint, however
// I get MethodInvocation as input parameter in this method
}
// already defined log method
@Around("@annotation(loggable)")
public Object log(final ProceedingJoinPoint joinPoint, final Loggable loggable) throws Throwable {
......
.....
}
但是由于两种方法之间的类型不兼容,我无法继续。
有没有一种方法可以重用现有代码,而不用编写带有重复代码的全新方面来支持 Guice?
如果我没理解错的话,你想反转控制流,这可以通过回调来完成。
@Aspect
@Component
class LoggingAspect implements MethodInterceptor {
@Around("@annotation(loggable)")
public Object log(final ProceedingJoinPoint joinPoint, final Loggable loggable) throws Throwable {
return log(joinPoint::getArgs, () -> joinPoint.proceed(joinPoint.getArgs()));
}
@Override
public Object invoke(MethodInvocation methodInvocation) throws Throwable {
return log(methodInvocation::getArguments, methodInvocation::proceed);
}
public Object log(Supplier<Object[]> arguments, Supplier<Object[]> proceed) {
Object[] args = arguments.get();
//log method arguments
try {
Object returnValue = proceed.get();
// log return value
return returnValue;
} catch (Exception ex) {
// publish exception metrics to some other system
throw ex;
}
}
}
顺便说一句,你是故意只抓住 Exception
而不是 Throwable
吗? Error
s 不会被记录。