说我有两个类A和B,具有取决于A B

public class A {}

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

这很容易在单个PicoContainer的解决乙

    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.

有没有办法使这项工作没有什么好的办法?或者,这是一个反模式,而且我在错误的方式解决这个问题?

有帮助吗?

解决方案

我将登记在会话容器内乙以及。 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));

其他提示

解决不存在性能问题是不是一个好方法。你做任何分析,以验证问题?

如果不是,可考虑做,第一。

你启用容器上缓存(或您正在使用的Pico 1.x的)?

尝试阅读时,也许禁用缓存足够来解决这个问题。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top