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
lookup
attribute 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 (
beanInterface
or 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/myEJB
might cause a lookup ofmyEJB
in the server namespace).