Dependency injection 如何在wicket中使用依赖项注入?
如何将以下示例转换为使用wicket/IOC集成包之一 我想学习和理解DI/IOC模式。我读了很多关于它的书,但我发现如果不深入研究代码示例,就有点难以理解。我有一个完整的、可工作的Wicket面板的示例,我想我想将其转换为使用DI 该面板基本上是列表的web UI编辑器。它将IPanelFactory作为构造函数参数。构造函数创建一个列表(DefaultRefreshingView),面板工厂知道如何为每一行创建一个ViewPanel。panelFactory还知道如何创建add表单,以便将新项引入列表 我将删去大量代码,以触及我认为相关的核心内容:Dependency injection 如何在wicket中使用依赖项注入?,dependency-injection,ioc-container,wicket,Dependency Injection,Ioc Container,Wicket,如何将以下示例转换为使用wicket/IOC集成包之一 我想学习和理解DI/IOC模式。我读了很多关于它的书,但我发现如果不深入研究代码示例,就有点难以理解。我有一个完整的、可工作的Wicket面板的示例,我想我想将其转换为使用DI 该面板基本上是列表的web UI编辑器。它将IPanelFactory作为构造函数参数。构造函数创建一个列表(DefaultRefreshingView),面板工厂知道如何为每一行创建一个ViewPanel。panelFactory还知道如何创建add表单,以便将新
public interface IPanelFactory<T extends DomainEntity, U extends DomainEntity>
extends IDetachable {
IAddItemPanel<T, U> newAddItemPanel(String id);
Component newEditPanel(ViewPanel.ViewPanelParameters<T> parms);
Component newListPanel(String id, IModel<Collection<T>> listModel);
}
public class ListEditorPanel2<T extends DomainEntity, U extends DomainEntity>
extends Panel implements IHeaderContributor {
private static final long serialVersionUID = 1L;
private final IPanelFactory<T, U> panelFactory;
public ListEditorPanel2(String id, IModel<Collection<T>> listModel,
final IPanelFactory<T, U> panelFactory) {
super(id, listModel);
this.panelFactory = panelFactory;
final AjaxCell listCell = new AjaxCell("listCell");
DefaultRefreshingView<T> itemList = new DefaultRefreshingView<T>(
"itemList", listModel) {
@Override
protected void populateItem(final Item<T> item) {
Component editPanel = ListEditorPanel2.this.panelFactory
.newEditPanel(new ViewPanelParameters<T>("viewPanel",
item.getModel(), new EditPanelCallback(item)));
item.add(editPanel);
}
};
listCell.add(itemList);
add(listCell);
final IAddItemPanel<T, U> addItemPanel = panelFactory
.newAddItemPanel("addItemForm");
add((Component) addItemPanel);
Form<T> form = addItemPanel.getForm();
}
}
公共接口IPanelFactory
扩展IDetachable{
IAddItemPanel newAddItemPanel(字符串id);
组件newEditPanel(ViewPanel.ViewPanelParameters parms);
组件newListPanel(字符串id,IModel listModel);
}
公共类ListedTorPanel2
扩展面板实现IHeaderContributor{
私有静态最终长serialVersionUID=1L;
私人最终IPanelFactory panelFactory;
public ListEditorPanel2(字符串id、IModel listModel、,
最终IPanelFactory Panel(工厂){
super(id,listModel);
this.panelFactory=panelFactory;
最终AjaxCell列表单元格=新AjaxCell(“列表单元格”);
DefaultRefreshingView项目列表=新建DefaultRefreshingView(
“项目列表”,列表模型){
@凌驾
受保护的无效填充项(最终项){
Component editPanel=ListEditorPanel2.this.panelFactory
.newEditPanel(新的viewPanel参数(“viewPanel”),
getModel(),新的EditPanelCallback(item));
添加项(编辑面板);
}
};
添加(itemList);
添加(列表单元格);
最终IAddItemPanel addItemPanel=面板工厂
.newAddItemPanel(“addItemForm”);
添加((成分)addItemPanel);
Form Form=addItemPanel.getForm();
}
}
IPanelFactory的每个实现都为视图和添加部分提供了不同的组件。ListEditorPanel2可以有多个实例在同一页面层次结构中使用不同的工厂实现
我的想法是,我希望IPanelFactory成为一个注入依赖项。所以
- 这是DI/IOC的一个好用例,还是在这里使用它没有意义
- 在不使用IOC容器的情况下,我如何“手动”完成此操作?(我已经在做了吗?)
- 我应该使用哪个wicket IOC集成?我目前正在使用wicket 1.4.8。我本来打算试试wicket spring annot,但看起来这个项目已经过时了
- 如何设置IOC容器来为wicket组件执行此操作
Injector injector = Guice.createInjector(new AppModule(),PersistenceService.usingJpa().across(UnitOfWork.REQUEST).buildModule());
addComponentInstantiationListener(new GuiceComponentInjector(this, injector));
这里我用两个模块实例化了一个guice注入器,即appModule和Persistence module(忽略persistenceModule的详细信息。我使用warp persist处理事务)
在guice模块中,绑定要注入的所有组件。我主要绑定我的DAO和我的服务。然后,我可以将其注入到我的面板、页面和任何其他wicket组件中。我还可以绑定面板和其他自定义组件,以便在必要时将它们注入其他组件。但是,我还没有发现需要绑定和注入用户界面组件的情况 谢谢!我已经找到了一个wicket spring配置,它允许我注入DAO。我正在玩一点,我可能会读一读Guice,看看它是如何比较的。