2014-01-05 4 views
0

Я пытаюсь использовать Picocontainer Web (picocontainer-web-core-2.5.1.jar).Как использовать Picocontainer Web?

Я настроил все, и я проверил, что все работает нормально, до тех пор, пытаясь получить что-нибудь из контейнера ...: р

я, хотя я должен использовать статический метод 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“не инстанциируемый») на третьей строке (addComponent).

И мой вопрос: Как пользоваться этой библиотекой? Я был уверен, что я понимаю, но реализация этого одного метода взрывает мой разум ...

ответ

1

На самом деле вы не должны использовать getComponent, если нет специального случая. Контейнеры App/Session/Request создаются для вас, когда вы добавляете прослушиватель контекста pico к web.xml. Просто сконфигурируйте компоненты для каждой области действия, а пикоконтейнер будет автоматически вводить материал и создавать компоненты, когда это необходимо. Также используйте интерфейс Startable lifecycle.

0

Я понял одно приемлемое решение - писать собственную версию 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); 
    } 
} 

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

Смежные вопросы