【问题标题】:Passing state to CDI-container-managed beans将状态传递给 CDI 容器管理的 bean
【发布时间】:2013-11-15 20:21:26
【问题描述】:

我在这个项目中使用了 Spring,但我在使用 Guice 时也遇到了同样的问题。

基本上,我的功能需要无状态助手和状态数据才能操作。

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

}

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

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

public class AwesomeFactory {
    @Inject
    private Helper helper;

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

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

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

【问题讨论】:

  • 当参数过多时,引入上下文或传输对象,如包装参数的StateDTOStateContext。这比使用 aop 的“解决方法”要好得多。

标签: java spring cdi


【解决方案1】:

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

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

【讨论】:

  • 嗯...这很酷。它仍然牺牲了一些 IOC,我真的很讨厌必须调试 AOP 代码,但我一定会调查一下
  • @Floegipoky 这里没有灵丹妙药:(,否则所有人都会使用它:)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-02
相关资源
最近更新 更多