【发布时间】: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