0

我正在尝试使用 Picocontainer Web (picocontainer-web-core-2.5.1.jar)。

我已经配置了所有内容,并且检查了一切正常,直到尝试从容器中检索任何内容...:p

我虽然应该使用 PicoServletContainerFilter 类中的静态方法 getRequestComponentForThread(Class type),它看起来像这样:

public static Object getRequestComponentForThread(Class type) {
        MutablePicoContainer requestContainer = ServletFilter.currentRequestContainer.get();
        MutablePicoContainer container = new DefaultPicoContainer(requestContainer);
        container.addComponent(type);
        return container.getComponent(type);
}

但正如您所看到的,在该方法中,创建了 DefaultPicoContainer 的新实例,并且正在注册我试图检索的类型。

  • 如果 type 是 Class - 创建并返回新实例,而不是从父容器缓存一个...
  • 如果类型是接口 - 在第 3 行 (addComponent) 抛出运行时异常(“'ExampleInterface' 不可实例化”)。

我的问题是:如何使用这个库?我很确定我理解它,但是这种方法的实现让我大吃一惊......

4

2 回答 2

1

实际上你不应该使用 getComponent 除非有特殊情况。当您将 pico 上下文侦听器添加到 web.xml 时,将为您创建 App/Session/Request 容器。只需为每个范围配置组件,picocontainer 将自动注入内容并在需要时实例化组件。还使用 Startable 生命周期接口。

于 2014-01-09T14:55:00.157 回答
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);   
    }
}

我不确定这是否是最好的做法,但它对我来说很好。但是,如果您知道更好的解决方案,我将不胜感激:)

于 2014-01-05T23:22:58.873 回答