docs: public ExpressionFactory getExpressionFactory() {
          
          // lazy init here, sync to avoid race condition
          synchronized(this) {
              if (expressionFactory == null) {
                  expressionFactory = ExpressionFactory.newInstance();
              }    
          }
          
          //allow JCDI to wrap our expression factory so they can clean up objects after the expressions are through
          if (configManager.isJCDIEnabled()) {
              if (jcdiWrappedExpressionFactory==null) {
                  //wrap expressionFactory
                  ELFactoryWrapperForCDI wrapperExpressionFactory =JSPExtensionFactory.getWrapperExpressionFactory(); 
                  if (wrapperExpressionFactory!=null) {
                      jcdiWrappedExpressionFactory = (ExpressionFactory)wrapperExpressionFactory;
                      return jcdiWrappedExpressionFactory;
                  }
                  // this code is left here for historic purposes, not because we will want to do this in this way  anymore
                  //jcdiWrappedExpressionFactory = JspShim.createWrappedExpressionFactory(expressionFactory);
              } else {
                  return jcdiWrappedExpressionFactory;
              }
          }
          return expressionFactory;
      }