【问题标题】:How do I manage dynamic dependencies with PicoContainer?如何使用 PicoContainer 管理动态依赖项?
【发布时间】:2010-10-25 13:16:01
【问题描述】:

假设我有两个类 A 和 B,B 取决于 A。

public class A {}

public class B {
    public B(A a) {}
}

在单个 PicoContainer 中解析 B 很容易。

    final MutablePicoContainer root = new PicoBuilder().build();
    root.addComponent(new A());
    root.addComponent(B.class, B.class);
    System.out.println(root.getComponent(B.class));

但我想为不同的会话设置不同的B 实例,并使用A 的可变实例。我正在考虑这样的事情。

    // during startup
    final MutablePicoContainer root = new PicoBuilder().build();
    root.addComponent(B.class, B.class);

    // later, initialize sessions
    final MutablePicoContainer session = new PicoBuilder(root)
        .implementedBy(TransientPicoContainer.class)
        .build();
    session.addComponent(new A());

    // some request
    System.out.println(session.getComponent(B.class));

上面的代码不起作用,因为当向session 询问B 时,它会向父容器root 询问它。 B 在那里找到,但仅在 root 及其父级中解析,导致 UnsatisfiableDependenciesException.

有什么好的方法可以使这项工作吗?或者这是一种反模式,我以错误的方式解决问题?

【问题讨论】:

  • 你最好使用Spring!这是经过商业验证的。很多人都负担得起 picoc=>spring 迁移,因为 pico 容器不稳定且有问题......
  • 我不同意。 Pico 是一个比 Spring 更好的容器。 Spring 的优势在于它的社区,而不是它的技术。
  • @Ronald - 我不明白你的目标是什么。你想为每个会话创建一个新的 A 和一个相应的新 B 吗?为什么不使用你的“单容器”模式在会话容器而不是根中注册 A 和 B?
  • @erickson:是的,每个会话一个新的 B,并且可以同时有多个会话。单个容器可以工作,并且可以说更正确。但是会话是相当短暂的,所以我认为如果有一个“静态”父级和多个“动态”瞬态会话容器会更好(CPU 和内存方面)。也许复制每个会话容器的原始容器会更好,而不是像一个大容器一样的根/会话层次结构。

标签: java inversion-of-control ioc-container picocontainer


【解决方案1】:

解决不存在的性能问题不是一个好方法。您是否进行了任何分析来验证问题?

如果没有,请考虑先这样做。

【讨论】:

    【解决方案2】:

    您是否在容器上启用了缓存(或者您使用的是 Pico 1.x)?

    尝试阅读this,也许禁用缓存足以解决这个问题。

    【讨论】:

      【解决方案3】:

      我也会在会话容器中注册 B。您可以将 B 的任何其他依赖项保留在根容器中。假设 B 对 C 有另一个依赖项。因此您可以执行以下操作:

      // during startup
      final MutablePicoContainer root = new PicoBuilder().build();
      root.addComponent(C.class, C.class);
      
      // later, initialize sessions
      final MutablePicoContainer session = new PicoBuilder(root)
          .implementedBy(TransientPicoContainer.class)
          .build();
      session.addComponent(B.class, B.class);
      session.addComponent(new A());
      
      // some request
      System.out.println(session.getComponent(B.class));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-10-06
        • 2022-10-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-04
        • 2013-05-20
        • 1970-01-01
        相关资源
        最近更新 更多