自定义Spring Bean参数

时间:2014-11-17 15:06:41

标签: java spring akka

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

@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类是不可访问的。关于此事的任何意见都非常感谢。如果现在有问题,请发表评论。

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

1 个答案:

答案 0 :(得分:4)

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

SpringActorProducer

然后你可以像这样创建你的测试演员:

@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); } }