gpt4 book ai didi

java - 带有 Guice 的现代 Akka DI

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:54:49 25 4
gpt4 key购买 nike

这里有 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);
}
}

并给定注入(inject)了 MyServiceFizzActor:

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.
}
}

然后我问:我如何装配 MyActorSystemModule 来创建 FizzActor 的实例并正确地用 Java 注入(inject)它们(< em>不是 Scala!)?

请注意:FizzActor 不是我的 Actor 系统中唯一的 Actor !

最佳答案

使用Creator在 guice 模块的提供程序方法中创建 ActorRef。要区分未类型化的不同 ActorRef,请像使用任何 guice 系统一样在您的提供者方法和注入(inject)点上使用注释。例如,

在你的 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);
}
}));
}

然后为了使用actor服务,注入(inject)一个特定的ActorRef:

class ClientOfFizzActor {
@Inject
ClientOfFizzActor(@Named("fizzActor") ActorRef fizzActorRef) {..}
}

如果 Props.create(..) 子句是您的 actor 类中的静态工厂方法,它看起来会更干净。

关于java - 带有 Guice 的现代 Akka DI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30863934/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com