如何将Guice 2整合到Wicket中?
问题描述:
我想用Guice 2和Wicket 1.4。有一个“wicket-guice”包,它使用Guice 1.有人可以给我一个例子如何配置Wicket使用Guice 2进行注入(使用Maven)。如何将Guice 2整合到Wicket中?
正如你所看到的那样,我找到了一个解决方案,但是我想知道,如果使用Guice Servlets并将整个Wicket Application注册为ServletFilter和Guice,会更好。但我认为这会与小门对象创建策略相冲突。
答
为了回答我自己,我发布了解决方案,我在AtomicGamer Dev Blog的帮助下找到了解决方案。
由于wicket-guice只支持Guice 1,所以Guice需要从wicket-guice扩展中排除。
<dependencies>
<dependency>
<groupId>com.google.inject</groupId>
<artifactId>guice</artifactId>
<version>2.0</version>
</dependency>
<dependency>
<groupId>org.apache.wicket</groupId>
<artifactId>wicket-guice</artifactId>
<version>${wicket.version}</version>
<exclusions>
<exclusion>
<groupId>com.google.code.guice</groupId>
<artifactId>guice</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.wicket</groupId>
<artifactId>wicket</artifactId>
<version>${wicket.version}</version>
</dependency>
<dependencies>
实际的整合发生在init
方法,它调用的方法addComponentInstantiationListener
。
import com.google.inject.Guice;
import com.google.inject.Injector;
import org.apache.wicket.Page;
import org.apache.wicket.protocol.http.WebApplication;
import org.apache.wicket.guice.GuiceComponentInjector;
public class NavigatorApplication extends WebApplication {
@Override
public Class<? extends Page> getHomePage() {
return Startpage.class;
}
@Override
protected void init() {
super.init();
Injector injector = Guice.createInjector(new WebAppModule());
addComponentInstantiationListener(
new GuiceComponentInjector(this, injector));
}
}
答
我已经成功实现,其中检票口的配置和启动使用Guice的servlet模块纯Java代码编写的一个解决方案 - 没有用于检票口在所有的XML。
所有的细节在我撰写的博客文章中被描述为here。
完整源代码(zip/svn)和一个工作示例eclipse项目也可以下载(链接在帖子末尾)。
我想你会发现它很好,再次忘记web.xml的维护:)