At the last Seam team meeting, the issue came up (once again) of how to get the BeanManager from a non-contextual resource. The reality is that there are certain lifecycle classes in Java EE that did not getĀ categorizedĀ as components (e.g., PhaseListener) and therefore do not support injection. They are "outside" of CDI. We are working on an SPI for JSF to make these classes CDI beans, but there will always be other cases.
In the current version of the spec, the standard way of looking up the BeanManager is to use JNDI. However, JNDI is not consistently supported in environments for which we want to write portable extensions (whether we like it or not, people use servlet containers). Weld puts the BeanManager in a servlet context attribute equal to the FQCN of BeanManager. Pete suggested that we submit a change request to have this location standardized when running in a servlet environment.
With this change, the BeanManager can be obtained as follows:
BeanManager manager = (BeanManager) getServletContext().getAttribute(BeanManager.class.getName());
This requires no change in Weld, since Weld is already doing this.