这里有Java 8,Guice 4.0和Akka 2.3.9.我试图弄清楚如何使用JSR330样式的@Inject注释来注释我的actor类,然后通过Guice将它们连接起来.
但实际上,我读过的每一篇文章(下面的一些例子)都使用了Scala代码示例,一个犯罪版本的Guice,或者是一个犯罪旧版本的Akka:
因此,给出以下Guice模块:
public interface MyService {
void doSomething();
}
public class MyServiceImpl implements MyService {
@Override
public void doSomething() {
System.out.println("Something has been done!");
}
}
public class MyActorSystemModule extends AbstractModule {
@Override
public void configure() {
bind(MyService.class).to(MyServiceImpl.class);
}
}
Run Code Online (Sandbox Code Playgroud)
并且考虑FizzActor到注入了MyService:
public class FizzActor extends UntypedActor {
private final MyService myService;
@Inject
public FizzActor(MyService myService) {
super();
this.myService = myService;
}
@Override
public void onReceive(Object message) {
// .. Do fizz stuff inside here.
}
}
Run Code Online (Sandbox Code Playgroud)
然后我问:我如何装配MyActorSystemModule创建实例FizzActor并用Java正确注入它们(而不是 Scala!)?
请注意:FizzActor不是演员系统中唯一的演员!
使用CreatorActorRef在guice模块的提供者方法中创建s.要区分不同ActorRef类型的不同s,请在提供者方法和注入点上使用注释,就像使用任何guice系统一样.例如,
在你的guice模块中:
@Override
protected void configure() {
bind(ActorSystem.class).toInstance(ActorSystem.apply());
bind(FizzService.class).toInstance(new FizzServiceImpl());
}
@Provides @Singleton @Named("fizzActor")
ActorRef serviceActorRef(final ActorSystem system, final FizzService fizzService) {
return system.actorOf(Props.create(new Creator<Actor>() {
@Override
public Actor create() throws Exception {
return new FizzActor(fizzService);
}
}));
}
Run Code Online (Sandbox Code Playgroud)
然后使用actor服务,注入一个特定的ActorRef:
class ClientOfFizzActor {
@Inject
ClientOfFizzActor(@Named("fizzActor") ActorRef fizzActorRef) {..}
}
Run Code Online (Sandbox Code Playgroud)
如果Props.create(..)子句是actor类中的静态工厂方法,它看起来更干净.