我有一个使用辅助注射创建的类(WindowedCounter)。我需要将这个类的工厂注入方法拦截器。现在,方法拦截器只能绑定到具体实例。所以我的问题是如何巧妙地做到这一点。
以下代码是我到目前为止所提出的。我为工厂创建了一个Factory Provider,并使用它来获取模块本身的工厂实例。然后绑定到该类并用于获取绑定到拦截器的实例。但是,从Guice 3.0开始,FactoryProvider类已折旧。
Guice 3.0的做法是什么?
我可以在模块中注入实例吗?
Provider<WindowedCounterFactory> wCountFactoryProvider = FactoryProvider.newFactory(WindowedCounterFactory.class, WindowedCounter.class);
bind(WindowedCounterFactory.class).toProvider(wCountFactoryProvider);
WindowedCounterFactory wCountFactory = wCountFactoryProvider.get();
bindInterceptor(Matchers.any(), Matchers.annotatedWith(RateLimited.class), new RateLimitingInterceptor(wCountFactory));
答案 0 :(得分:1)
FactoryProvider的替换为FactoryModuleBuilder。它会将模块返回到install
,但在您的模块中,您可以调用getProvider
为您的类型获取有效的注射器创建提供程序。
理论上,在创建Injector之前,您不应该访问您的类型(例如,某些依赖项可能绑定在其他模块中);这可能要求您重构在MethodInterceptor中使用Provider,或者在child injector中安装拦截器,这样您就可以从“父”注入器获取Factory的实例。
install(new FactoryModuleBuilder().build(WindowedCounterFactory.class));
bindInterceptor(Matchers.any(), Matchers.annotatedWith(RateLimited.class),
new RateLimitingInterceptor(getProvider(WindowedCounterFactory.class)));