如何使用Picocontainer Web?

时间:2014-01-05 20:36:47

标签: java web picocontainer

我正在尝试使用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 - 创建并返回新实例,而不是从父容器中缓存一个...
  • 如果type是一个接口 - 在第3行(addComponent)抛出运行时异常(“'ExampleInterface'不可实例化”)。

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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);   
    }
}

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