使用Guice注入许多装饰实例 - 将HessianServlet与Guice混合

时间:2012-02-13 11:35:30

标签: java design-patterns dependency-injection guice hessian

在Guice servlet模块configureServlets()中给出以下代码:

serve("/a").with(new Decorator(new A()));
serve("/b").with(new Decorator(new B()));
...
serve("/z").with(new Decorator(new Z()));
...

正确注入所有这些的最佳/最简单的解决方案是什么? (即在各种装饰类A,B,C中注入字段......)

我在考虑使用命名提供程序,但我不希望为每个A,B,C定义新的提供程序类......理想的解决方案因此是通用的。


与GUICE混合HESSIAN ......

为了帮助确定问题,真正的代码使用了Hessian的Web服务。在网上挖掘之后,目前没有正确回答了这个问题(我看过很多丑陋的黑客攻击),而 Guillaume 给出的解决方案符合要求。这个确切的案例。

总结原始问题:要使用Hessian实现Web服务,必须实现HessianServletGenericServlet;但Guice只能绑定HttpServlet。因此,诀窍是实现一个薄的包装器HessianHttpServlet

class HessianHttpServlet extends HttpServlet {
    public HessianHttpServlet(HessianServlet hessianServlet) {
        this.hessianServlet = hessianServlet;
    }
    @Override public void init(ServletConfig config) throws ServletException {
        hessianServlet.init(config);
    }
    @Override public void service(ServletRequest request, ServletResponse response) {                 
        hessianServlet.service(request, response);
    }
}

并致电:

serve("/a").with(new HessianHttpServlet(new WebServiceA()));

因此,完整的解决方案就是注入WebService X

void configureServlet() {
    serve("/a").with(new HessianHttpServlet(inject(new WebServiceA())));
    serve("/b").with(new HessianHttpServlet(inject(new WebServiceB())));
    ...
    serve("/z").with(new HessianHttpServlet(inject(new WebServiceZ())));
}
private HessianServlet inject(HessianServlet hessianServlet) {
    requestInjection(hessianServlet);
    return hessianServlet;
}

2 个答案:

答案 0 :(得分:3)

您可以在每个装饰器上使用requestInjection(Object instance)

答案 1 :(得分:1)

我创建了一个小型开源项目,可以轻松集成hessian和guice。您可以使用基于注释的配置,如下所示: WebService的:

@HessianWebService
public class UserServiceImpl implements UserService {
    ...
}

Guice配置:

public class WebServiceGuiceServletContextListener extends GuiceServletContextListener {
    @Override
    protected Injector getInjector() {
        return Guice.createInjector(
                /* your guice modules */
                new HessianWebServicesModule("your web service implementations package")
        );
    }
}

或使用EDSL的手动方式:

public class WebServiceGuiceServletContextListener extends GuiceServletContextListener {
    @Override
    protected Injector getInjector() {
        return Guice.createInjector(
                /* your guice modules */
                new HessianWebServicesModule(){
                    @Override
                    protected void configureHessianWebServices() {
                        serveHessianWebService(UserService.class).usingUrl("/Users");
                    }
                }
        );
    }
}

此处提供了更多信息,配置选项和完整示例:https://bitbucket.org/richard_hauswald/hessian-guice/