Guice中的Aop,通常是结合自定义注解实现。
以实现一个日志打印的切面注解为例:
1、自定义注解
@Retention(RetentionPolicy.RUNTIME)
public @interface Logged {
}
2、在module中实现绑定
image.png
第一个参数:作用在哪些class上
第二个参数:哪些class会执行(标有对应注解的才执行)
第三个参数:MethodIntercaptor接口实现类
bindInterceptor(Matchers.any(),
Matchers.annotatedWith(Logged.class),
new MethodInterceptor() {
@Override
public Object invoke(MethodInvocation methodInvocation) throws Throwable {
Method method = methodInvocation.getMethod();
System.out.println("Hello World");
return methodInvocation.proceed();
}
});
3、当在第三个参数MethodIntercaptor接口实现类中想要某个注入的成员变量
public class LoggerInterceptor implements MethodInterceptor {
@Inject @Output private String message;
@Override
public Object invoke(MethodInvocation methodInvocation) throws Throwable {
Method method = methodInvocation.getMethod();
System.out.println(message);
return methodInvocation.proceed();
}
}
使用到了一个@Output的注入变量,那么在绑定时,要加上requestInjection(loggerInterceptor);
LoggerInterceptor loggerInterceptor=new LoggerInterceptor();
requestInjection(loggerInterceptor);
bindInterceptor(Matchers.any(),
Matchers.annotatedWith(Logged.class),
loggerInterceptor
);
注意:
guice的Aop必须使用在通过guice创建的对象上,比如我们手工创建一个对象,添加日志AOP,这时,guice也是没有办法去拦截的,必须通过guice从头开始inject开始的才可以进行AOP处理
网友评论