为什么我应该使用createComponent而不是自己创建实例?

时间:2013-05-17 13:45:53

标签: jsf-2

这更像是一个概念性问题。

我必须处理必须创建动态h:dataTable的功能。每当我创建一个组件时,我都会做类似的事情:

DataTable table = (DataTable) FacesContext.getCurrentInstance().getApplication()
                      .createComponent(DataTable.COMPONENT_TYPE);

使用FacesContext为我创建一切。

然而,我可以简单地做到这一点:

DataTable table = new DataTable();

我之所以这样做的原因是我在开发过程中阅读的所有教程和材料都是这样做的,但我从来没有得到明确答案的原因。

为什么第一个优于第二个?

1 个答案:

答案 0 :(得分:8)

Application#createComponent()添加了一个额外的抽象层,允许运行时多态性和可插拔性。具体实现可以通过<component>中的faces-config.xml条目进行配置,而new SomeDriver()可以通过JAR提供。这允许在不重写/重新编译代码的情况下更改实现。

它与JDBC API的工作方式完全相同:您不执行Class.forName(someDriverClassName),但执行{{1}},这使得驱动程序不是编译时依赖项,因此您的JDBC代码可以移植到许多数据库供应商没有重写/重新编译。

但是,如果应用程序仅用于“内部使用”而不是可分发的(因此所有代码总是在您的控制之下),那么运行时多态性没有那么大的优势并且可能会增加(非常小的)开销。

另见: