如何使用PicoContainer管理动态依赖关系?

时间:2009-05-12 12:45:06

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

假设我有两个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时,它会询问父容器rootB在那里找到,但仅在root及其父母内解决,导致UnsatisfiableDependenciesException.

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

3 个答案:

答案 0 :(得分:1)

解决不存在的性能问题不是一个好方法。你有没有做过任何分析来验证这个问题?

如果没有,请考虑先做。

答案 1 :(得分:1)

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

尝试阅读this,可能禁用缓存足以解决此问题。

答案 2 :(得分:0)

我也会在会话容器中注册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));