Java 用Guice注入多个装饰实例——谈HessianServlet与Guice的混合
在Guice servlet模块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服务。在网上挖掘后,目前没有关于这个问题的正确答案(我见过许多丑陋的黑客),纪尧姆给出的解决方案符合这个确切案例的要
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");
}
}
);
}
}