在运行时使用注释获取 guice 对象?
Getting a guice object at runtime with an annotation?
我有供应商:
@SuppressWarnings({ "rawtypes", "unchecked" })
@Provides
@Singleton
@OutboundBroker
public EventBroker outboundBrokerProvider()
在运行时,我想要这个。
EventBroker outbound=injector.getInstance(Key.get(EventBroker.class, Names.named("OutboundBroker")));
但是,此代码不起作用 -- 提供程序未命名,但我不知道如何使用注释 @OutboundBroker
检索它
Key.get(EventBroker.class, OutboundBroker.class)
需要从 Injector
中获取多个对象的情况极为罕见。如果您使用纯 dependency-injection,您的 main()
方法(或您的容器)会创建注入器并获取一个对象,然后调用该对象上的一个或多个方法。一个对象将被注入它需要的东西。
所以你可以这样做:
class EventService {
private final EventBroker outboundEventBroker;
@Inject
private EventService(
@OutboundBroker EventBroker outboundBroker) {
this.outboundEventBroker = outboundBroker;
}
...
}
正如 Jeff Bowman 所说,这假设 OutboundBroker
本身用 @BindingAnnotation
注释。
我有供应商:
@SuppressWarnings({ "rawtypes", "unchecked" })
@Provides
@Singleton
@OutboundBroker
public EventBroker outboundBrokerProvider()
在运行时,我想要这个。
EventBroker outbound=injector.getInstance(Key.get(EventBroker.class, Names.named("OutboundBroker")));
但是,此代码不起作用 -- 提供程序未命名,但我不知道如何使用注释 @OutboundBroker
检索它Key.get(EventBroker.class, OutboundBroker.class)
需要从 Injector
中获取多个对象的情况极为罕见。如果您使用纯 dependency-injection,您的 main()
方法(或您的容器)会创建注入器并获取一个对象,然后调用该对象上的一个或多个方法。一个对象将被注入它需要的东西。
所以你可以这样做:
class EventService {
private final EventBroker outboundEventBroker;
@Inject
private EventService(
@OutboundBroker EventBroker outboundBroker) {
this.outboundEventBroker = outboundBroker;
}
...
}
正如 Jeff Bowman 所说,这假设 OutboundBroker
本身用 @BindingAnnotation
注释。