Скажем, у меня есть два класса А и В, с В зависимости от А.Как управлять динамическими зависимостями с помощью PicoContainer?
public class A {}
public class B {
public B(A a) {}
}
Это легко решить B в одном 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.
Есть ли хороший способ сделать эту работу? Или это анти-шаблон, и я решу проблему не так?
Лучше использовать весну! Это дело доказано. Так много людей могут позволить себе picoc => весеннюю миграцию, потому что контейнер pico был нестабильным и багги ... –
Я не согласен. Пико - это гораздо лучший контейнер, чем весна. Преимущество весны - это его сообщество, а не его технология. – erickson
@ Ronald - Я не совсем понимаю, в чем ваша цель. Вы хотите, чтобы для каждого сеанса был создан новый A и соответствующий новый B? Почему бы не использовать шаблон «одного контейнера» для регистрации A и B в контейнере сеанса, а не в корне? – erickson