I was looking through some JSF controllers and it was a mix of @Named and @ManagedBean annotations. These annotations provide similar dependency injections, but there are important differences.
- @ManagedBean –
javax.faces.bean.ManagedBean– managed by JSF container
- @Named –
javax.faces.bean– CDI bean managed by application server
This means @Named beans are visible to the whole JEE container, while @ManagedBean are visible only to the JSF container. The visibility issue is covered in this table:
* – only if scope of injected bean is broader
One problem is that @Named requires that you use a JEE enabled container – so you have to use TomEE instead of Tomcat.
A further problem in earlier CDI versions was that there was no CDI equivalent of @ViewScoped. This has now been resolved with
You also need to be very careful with mixing JSF and CDI as they use different packages –
So What Approach Should You Use?
This is a non-question as from JSF2.3 onwards @ManagedBean is being phased out and the recommended approach is @Named. It is also important not to mix CDI with JSP scopes
However there are circumstances when I would still use @ManagedBean at present:
- Existing Code is using @ManagedBean – I would stick with @ManagedBean until a migration path is determined
- Web Container – You just want to use a web container – then sticking with JSF ManagedBeans would be easier