Getting Stuff from the Container
Generally speaking the only way to get a Container-Managed Resource is via dependency injection or lookup from within a Container-Managed Component.
The unbreakable rules. Read these over and over again when things don't work.
- java:comp/env is the spec defined namespace for lookup of any Container-Managed Resource
- java:comp/env is empty by default
- java:comp/env is read-only at runtime
- java:comp/env is populated by Declaring References to Container-Managed Resource via xml or annotation
- only Container-Managed Components, not their libraries, can Declare References via xml or annotation
- only Container-Managed Components, not their libraries, can get dependency injection of Container-Managed Resources
- only Container-Managed Components, and their libraries, may lookup from java:comp/env
- you must use the no-arg 'new InitialContext()' constructor to lookup something from java:comp/env
- the annotations and xml for Declaring References are identical in functionality, both always configure lookup with optional dependency injection
InitialContext Lookups
- Server side beans should access other beans on the server via the default no args constructor (EJB 3 spec 15.3.1 Bean Provider's Responsibilities).
- Container side lookup names must be preceded with java:comp/env, as in java:comp/env/myBean. e.g.
initialContext.lookup("java:comp/env/beanName")
- note that java:comp/env/ is empty by default, and you need to declare your references, whether via xml or annotations
- Declared via annotations
@EJB(name="myBean", beanInterface = IMyBean.class) public class DependentBean ....
- Declared via xml INCOMPLETE
- Declared via annotations
- Clients is a good reference for more complex lookups, including authentication (only for non-standard clients not running in an EJB container).
Injection
Some important things to realize about dependency injections.
- @EJB IMyBean myBean is syntactic sugar for lookups (as follows), and is overridden by xml
initialContext = new InitialContext(); initialContext.lookup("java:comp/env/beanName")
- EJB Refs is a good reference for injection via xml or annotations