The @EJB annotation (and @Resource, @WebServiceRef, etc.) serves two purposes:
- It declares a reference in the component namespace. For example,
@EJB(name="myEJB")creates a referencejava:comp/env/myEJB. If you annotate a field and do not specify a name, then it creates a referencejava:comp/env/com.example.MyClass/myField. - If the annotation is declared on a field or setter method, then the container performs injection when the component is created.
How the reference is resolved varies, independent of whether the reference is being resolved for a lookup("java:comp/env/myEJB") or due to injection:
- If EE 6+ is used, the
lookupattribute requires a JNDI lookup to resolve the target. - Some application servers support
mappedName, which is specified to be vendor specific. This is usually implemented by performing a lookup. - Application servers support bindings at deployment time. This is usually implemented by performing a lookup.
- If no other binding information is provided and the bean interface (
beanInterfaceor the field type) is only implemented by a single EJB in the application, then the EJB specification requires that it fall back to that. - If no other binding information is provided and #4 cannot work, some application servers will attempt to perform a lookup in the server namespace based on the ref name (for example,
java:comp/env/myEJBmight cause a lookup ofmyEJBin the server namespace).