自定义Spring Bean参数

我正在使用在activator上发布的Spring Akka示例来创建Spring托管bean演员。 这是我目前正在使用的代码,包括一个演示类:

@Component class Test extends UntypedActor { @Autowired protected ObjectMapper objectMapper; protected final Account account; protected final Order order; public Test(Account account, Order order) { this.account = account; this.order = order; } @Override public void onReceive(Object message) throws Exception { if (message instanceof SomeCommand) { // Do something using the order and the account; } else if (message instanceof FooCommand) { // More stuff } } } @Component public class SpringExtension extends AbstractExtensionId implements ExtensionIdProvider { @Autowired private ApplicationContext applicationContext; @Override public SpringExtensionImpl createExtension(ExtendedActorSystem system) { return applicationContext.getBean(SpringExtensionImpl.class); } @Override public ExtensionId lookup() { return applicationContext.getBean(SpringExtension.class); } } @Component public class SpringExtensionImpl implements Extension { @Autowired private ApplicationContext applicationContext; public Props props(String actorBeanName) { return Props.create(SpringActorProducer.class, applicationContext, actorBeanName); } } public class SpringActorProducer implements IndirectActorProducer { private final ApplicationContext applicationContext; private final String actorBeanName; public SpringActorProducer(ApplicationContext applicationContext, String actorBeanName) { this.applicationContext = applicationContext; this.actorBeanName = actorBeanName; } @Override public Actor produce() { return (Actor) applicationContext.getBean(actorBeanName); } @Override public Class actorClass() { return (Class) applicationContext.getType(actorBeanName); } } 

现在我的问题是,如何用自定义构造函数参数实例化一个actor。 我曾考虑使用工厂或setter方法,但我不认为这是一个选项,因为我相信底层的Actor类是不可访问的。 关于此事的任何意见都非常感谢。 如果现在有问题,请发表评论。

PS。 如果您认为我的代码中存在错误或有更好的解决方法,请告诉我! 我对Spring和Akka的经验很少,所以任何建议都值得赞赏。

您可以将其他参数作为varargs( Object... )传递给SpringExtensionImplSpringActorProducer 。 所以你的代码看起来像这样:

 @Component public class SpringExtensionImpl implements Extension { @Autowired private ApplicationContext applicationContext; public Props props(String actorBeanName, Object... args) { return (args != null && args.length > 0) ? Props.create(SpringActorProducer.class, applicationContext, actorBeanName, args) : Props.create(SpringActorProducer.class, applicationContext, actorBeanName); } } public class SpringActorProducer implements IndirectActorProducer { private final ApplicationContext applicationContext; private final String actorBeanName; private final Object[] args; public SpringActorProducer(ApplicationContext applicationContext, String actorBeanName) { this.applicationContext = applicationContext; this.actorBeanName = actorBeanName; this.args = null; } public SpringActorProducer(ApplicationContext applicationContext, String actorBeanName, Object... args) { this.applicationContext = applicationContext; this.actorBeanName = actorBeanName; this.args = args; } @Override public Actor produce() { return args == null ? (Actor) applicationContext.getBean(actorBeanName): (Actor) applicationContext.getBean(actorBeanName, args); } @Override public Class actorClass() { return (Class) applicationContext.getType(actorBeanName); } } 

然后,您可以像这样创建Test actor:

SpringExtensionImpl springExtensionImpl; actorSystem.actorOf(springExtensionImpl.create(Test.class, account, order));