Как использовать Picocontainer Web?
Я пытаюсь использовать Picocontainer Web (picocontainer-web-core-2.5.1.jar).
Я все настроил и проверил, что все работает нормально, пока не попытался извлечь что-либо из контейнера...: p
Хотя я должен использовать статический метод getRequestComponentForThread (тип класса) из класса PicoServletContainerFilter, который выглядит следующим образом:
public static Object getRequestComponentForThread(Class type) {
MutablePicoContainer requestContainer = ServletFilter.currentRequestContainer.get();
MutablePicoContainer container = new DefaultPicoContainer(requestContainer);
container.addComponent(type);
return container.getComponent(type);
}
Но, как вы можете видеть, в этом методе создается новый экземпляр DefaultPicoContainer, и тип, который я пытаюсь получить, регистрируется.
- если тип является классом - новый экземпляр создается и возвращается, а не кэшируется из родительского контейнера...
- если тип является интерфейсом - исключение времени выполнения ("ExampleInterface" не является экземпляром ") выдается на 3-й строке (addComponent).
И мой вопрос: как использовать эту библиотеку? Я был почти уверен, что понимаю это, но реализация этого единственного метода поражает меня...
2 ответа
На самом деле вы не должны использовать getComponent, если нет особого случая. Контейнеры App/Session/Request создаются для вас, когда вы добавляете прослушиватель контекста pico в файл web.xml. Просто настройте компоненты для каждой области видимости, и picocontainer будет автоматически внедрять компоненты и создавать экземпляры компонентов при необходимости. Также используйте интерфейс жизненного цикла Startable.
Я нашел одно приемлемое решение - написание собственной версии org.picocontainer.web.PicoServletContainerFilter.ServletFilter - и добавление одного метода:
public class MyComponentContainer extends PicoServletContainerFilter {
/*
code from original class PicoServletContainerFilter.ServletFilter
[...]
*/
public static <T> T getComponent(Class<T> clazz) {
return (T) currentRequestContainer.get().getComponent(clazz);
}
}
Я не уверен, что это лучше, но для меня это хорошо. Однако, если вы знаете лучшее решение, я был бы благодарен за информацию:)