UIComponent.getId() is by far the most requested component attribute.
There are a number of reasons for this:
1) The JSF RI has an issue in the JSP-JSF integration which causes
getId() to be called n^2 times where n is the number of children a
component has
2) getClientId() calls getId()
3) FindComponent calls getId()
4) The tree visiting code trades off calls to getClientId() for calls to
getId()
FacesBean optimizes attribute Map access at the expense of access
directly through the component. The the extent that Renderers are
Components are accessing the attributes through the attribute Map, this
is fine, however even the Renderers access attributes common to all
UIComponents such as id() through the component directly. Considering
the huge number of times that the the id is accessed (for some renders,
this was 8% of the rendering time), it makes sense to optimize this path.
The proposal is to:
1) Store the id an an instance variable on the UIXComponent
2) Add a new capability flag to PropertyKey indicating that the property
is actually stored elsewhere using a ValueExpression will be stored as
the property's value in the PropertyMap. For access through the
FacesBean, the ValueExpression will be evaluated to get/set the actual value
3) For state saving the ValueExpression is used to retrieve the actual
value and for state restoration the ValueExpression (which has been
rebootstrapped by the UIXComponent) is used to write the value back
4) Instead of setting the id attribute in the FacesBean, UIXComponent
stores it locally and sets an ValueExpression implementation into the
FacesBean that retrieves the value from the UIXComponent
API Changes:
PropertyKey:
add
/**
* Capability indicating that values for this property should be
* be stored and retrieved through a ValueExpression rather than on the
* FacesBean itself
*/
static public final int CAP_VALUE_EXPRESSION_IMPLEMENTATION = 16;
/**
* Returns <code>true</code> if property values for this key are set
and get
* using a ValueExpression rather than storing the value in the FacesBean.
* @return <code>true</code> if properties values for this key are
retrieved
* with a ValueExpression.
*/
public boolean usesValueExpressionAsImplementation()
After this change id retrieval doesn't make the 1% YourKit profiler hot
spot cut off