将状态传递给CDI容器管理的bean

时间:2013-11-15 20:21:27

标签: java spring cdi

我正在为这个项目使用Spring,但我也和Guice有同样的问题。

基本上,我的功能需要无状态帮助程序和状态数据才能运行。

public class AwesomeDoer {
    @Inject
    private Helper helper; //stateless
    ...
    public void doAwesome(int state) {
        helper.help(state)
    }

}

这看起来很不错,直到doAwesome有5个参数并被调用1000次,但每次参数中有3个是相同的值,而第四个参数可能只改变了几次。将适当的参数更改为字段是显而易见的解决方案。但是,这需要你牺牲这个类的CDI管理,否则你必须有一个初始化器或setter来填充Spring执行它之后的状态。

我通常通过创建一个由Spring管理的工厂来解决这个问题,即

public class AwesomeFactory {
    @Inject
    private Helper helper;

    public AwesomeDoer getAwesomeDoer(int state) {
        return new AwesomeDoer(helper, state);
    }
}

但同样,这意味着我的AwesomeDoer不再由Spring管理,它需要我编写另一层非业务逻辑。很容易想象这种方法会导致创建一个AwesomeFactoryFactory等,这总会让我在内部死一点。

那么有人有更清洁的方法吗?

1 个答案:

答案 0 :(得分:1)

您可以使用Spring中的@Configurable标记您的bean,并使用new AwesomeDoer创建它并在构造函数中传递参数。 @Configurable使您可以根据需要创建bean,并且Spring将管理bean以触发@Autowired之类的注入。

更多信息:Create a bean using new keyword and managed by Spring,请查看底部的部分。