java - 自定义 Spring Bean 参数

标签 java spring akka

我正在使用 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<SpringExtensionImpl> implements ExtensionIdProvider {

    @Autowired
    private ApplicationContext applicationContext;

    @Override
    public SpringExtensionImpl createExtension(ExtendedActorSystem system) {
        return applicationContext.getBean(SpringExtensionImpl.class);
    }

    @Override
    public ExtensionId<? extends Extension> 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<? extends Actor> actorClass() {
        return (Class<? extends Actor>) applicationContext.getType(actorBeanName);
    }

}

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

附言。如果您认为我的代码有错误或者有更好的解决方法,请告诉我!我对 Spring 和 Akka 的结合经验很少,因此不胜感激任何建议。

最佳答案

您可以将附加参数作为可变参数 (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<? extends Actor> actorClass() {
        return (Class<? extends Actor>) applicationContext.getType(actorBeanName);
    }

}

然后您可以像这样创建您的测试参与者:

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

关于java - 自定义 Spring Bean 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26975613/

相关文章:

java - JVM 中运行的默认线程数是多少?

java - 从 evaluateJavascript getElementById 返回的字符串带有斜杠和引号

java - Java 应用程序中的属性框架

java - 如何在 Spring XML 文件中声明 Java 8 方法引用?

spring - 访问被拒绝(用户是匿名的);重定向到身份验证入口点

java - 等待 RabbitMQ docker 容器使用 docker-maven-plugin 启动

java - 在旧的和奇异的 JVM 上,java.io.BufferedInputStream 的默认缓冲区大小是多少?

scala - 为什么使用 Akka TCP 连接会在 1 分钟后自动关闭?

scala - 如何合并两个有序的akka​​流以保存顺序

java - 类型安全配置 - 从程序设置占位符值