Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 用Guice注入多个装饰实例——谈HessianServlet与Guice的混合_Java_Design Patterns_Dependency Injection_Guice_Hessian - Fatal编程技术网

Java 用Guice注入多个装饰实例——谈HessianServlet与Guice的混合

Java 用Guice注入多个装饰实例——谈HessianServlet与Guice的混合,java,design-patterns,dependency-injection,guice,hessian,Java,Design Patterns,Dependency Injection,Guice,Hessian,在Guice servlet模块configureServlets()中提供以下代码: 正确注入这一切的最佳/最简单的解决方案是什么?(即各种装饰类A、B、C中的注入场…) 我正在考虑使用命名的提供者,但我不希望为每个a、B、C定义一个新的提供者类。。。因此,理想的解决方案是通用的 关于将黑森与GUICE混合… 为了帮助精确回答这个问题,真正的代码使用了带有Hessian的web服务。在网上挖掘后,目前没有关于这个问题的正确答案(我见过许多丑陋的黑客),纪尧姆给出的解决方案符合这个确切案例的要

在Guice servlet模块
configureServlets()
中提供以下代码:

正确注入这一切的最佳/最简单的解决方案是什么?(即各种装饰类A、B、C中的注入场…)

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


关于将黑森与GUICE混合…

为了帮助精确回答这个问题,真正的代码使用了带有Hessian的web服务。在网上挖掘后,目前没有关于这个问题的正确答案(我见过许多丑陋的黑客),纪尧姆给出的解决方案符合这个确切案例的要求

总结一下原始问题:要使用Hessian实现web服务,必须实现一个
HessianServlet
,它是一个
GenericServlet
;但是,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:


您可以在每个decorator上使用
requestInjection(对象实例)

我创建了一个小型开源项目,它可以轻松集成hessian和guice。您可以使用以下基于注释的配置: 网络服务:

@HessianWebService
public class UserServiceImpl implements UserService {
    ...
}
GUI配置:

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");
                    }
                }
        );
    }
}

这里提供了更多信息、配置选项和完整示例:

请原谅我的无知,但这个装饰器是什么?你就不能把发球(“/a”)和(a.class”)绑在一起吗?然后,将自动完成对A的注射。B、C、Z也是一样。我觉得我遗漏了一些东西。好吧,装饰师在这里是为了在所有装饰类a、B、C之上添加一个公共功能。。。将此功能直接添加到A、B、C中将打破拥有此装饰器的优势。此外,还可以动态更改装饰器;这里我举了一个只有一个decorator的简单例子。在我的例子中,我只需要注入修饰的实例,所以调用
service(“/a”)。使用(newdecorator(injected(new a()))
就可以了,使用
injected()
助手函数只需调用
requestInjection()
并返回实例。但不知何故,我写这篇文章感觉很糟糕,我觉得这有点滥用DI。我想我理解你的感受。您可能想用某种方式说serve(“/a*”)。with(Decorator.class)。use(a.class);(语法不正确,但它有点表达了您想要的内容)。不幸的是,我对Guice的了解还没有达到这个程度。
public class WebServiceGuiceServletContextListener extends GuiceServletContextListener {
    @Override
    protected Injector getInjector() {
        return Guice.createInjector(
                /* your guice modules */
                new HessianWebServicesModule("your web service implementations package")
        );
    }
}
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");
                    }
                }
        );
    }
}