Как использовать 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);   
    }
}

Я не уверен, что это лучше, но для меня это хорошо. Однако, если вы знаете лучшее решение, я был бы благодарен за информацию:)

Другие вопросы по тегам