- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在使用 Guice 为一个类中的所有方法创建一个拦截器,除了那些用我创建的特定类注释的方法:
这是抽象模块:
public class MyModule extends AbstractModule {
@Override
protected void configure() {
bindInterceptor(
Matchers.subclassesOf(MyFacade.class),
Matchers.not(Matchers.annotatedWith(DAO.class)),
new MyInterceptor());
}
}
现在,是否可以让我的 MethodInterceptor
忽略 MyFacade
中的所有方法,当它们被同一类中的另一个方法调用时(MyFacade
)?
例如:
public class MyFacade{
@DAO
public void doSomething(){
...
}
public void a(){
...
b();
}
public void b(){
...
}
}
我不希望拦截器拦截从方法 a() 到方法 b() 的调用。
谢谢!
最佳答案
要让被拦截者知道哪个类正在调用它,没有简单的方法。此外,在大多数情况下,您会希望调用 b()
来运行拦截的方法——例如确保正确打开和关闭数据库事务。如果您需要确保拦截只发生在外部调用上,您就必须要聪明一点。
考虑重写您的 MethodInterceptor 以让守卫检查它是否处于被拦截方法的中间。记住,bindInterceptor
accepts instances ,所以如果涉及到它,您可以将调用堆栈状态保留在那里。这是不寻常的——拦截器通常被认为是无状态的——所以要很好地记录下来。
/**
* Prevents internal interceptor calls from within intercepted methods.
* Not thread safe.
*/
public abstract class GuardedInteceptor implements MethodInterceptor {
private boolean executionInProgress = false;
/** No-op if in the middle of an intercepted method. */
public Object invoke(MethodInvocation invocation) throws Throwable {
if (executionInProgress) {
return invocation.proceed();
}
executionInProgress = true;
Object returnValue = null;
try {
runBefore();
returnValue = invocation.proceed();
runAfter();
} finally {
executionInProgress = false;
}
return returnValue;
}
protected abstract void runBefore();
protected abstract void runAfter();
}
在你的情况下,我会将 b()
委托(delegate)给私有(private)方法 bInternal()
并从内部调用它而不是 b()
我的门面。 Guice AOP 无法拦截私有(private)方法,因此您无需担心注释或配置任何其他内容。这也允许各个系统选择是调用可能被覆盖或拦截的公共(public)方法,还是调用有效最终的、可预测的私有(private)方法。 AOP拦截是通过继承实现的,所以标准规则是关于designing and documenting for inheritance在这里申请。
关于java - 忽略来自 bindInterceptor 中一个类的调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20362277/
我正在使用 Guice 为一个类中的所有方法创建一个拦截器,除了那些用我创建的特定类注释的方法: 这是抽象模块: public class MyModule extends AbstractModul
我有一个拦截器来限制对任意 API 的请求。我正在尝试编写一个支持插入 TPS 值的注释,以便任何方法都可以受到速率限制。 import java.lang.annotation.ElementTyp
我是一名优秀的程序员,十分优秀!