Hi,

if user uses plain old JSF style with managed beans like:

#{sessionScope.mySessionScopedBean} or
#{requestScope.myRequestScopedBean} or
#{requestScope.varFromDataTable.property}

it can achieve excellent performance during render response phase,
because every EL resolution takes only two steps:

1) o.a.m.ImplicitObjectResolver resolves sessionScope or requestScope to
java.util.Map
2) javax.el.MapELResolver reads map.get("mySessionScopedBean") and sets
elContext.setPropertyResolved

(at first access ManagedBeanResolver must create bean instance but we
can ignore it for simplicity). 

Specially if user uses EL resolvers ordering [1]  and creates chain of
(ImlicitObjectResolver,MapELResolver, other resolvers) then resolving
takes only two first resolvers.


Now compare it with situation where CDI is used. Because CDI/OWB
resolver is not so fast as default el resolvers, common usage is put it
at bottom of resolvers chain with OpenWebBeansELResolverComparator. Then
resolving must go thru all ELresolvers in chain (12 or more resolvers)
to find a @Named bean.


How to improve this? One thing can be use custom implicit object for
this
1) create ImplicitObjectsProvider SPI interface in myfaces
2) CDI and CDI extension will add own implementation of myfaces
ImlicitObject, for example #{codiWindowScope} from CODI
3) the resolved value from implicit object can mimic the map interfaces
(for example WindowScopeMap) to preserve behaviour of servlet scopes and
to use MapELResolver

WDYT? Any other ideas?


Regards,

Kočičák

[1] https://cwiki.apache.org/MYFACES/elresolver-ordering.html

Reply via email to