Title: Injection Of Ejbs
This example shows how to use the @EJB annotation on a bean class to refer to other beans.
This functionality is often referred as dependency injection (see http://www.martinfowler.com/articles/injection.html), and has been recently introduced in Java EE 5.
In this particular example, we will create two session stateless beans
The DataReader bean uses the DataStore to retrieve some informations, and we will see how we can, inside the DataReader bean, get a reference to the DataStore bean using the @EJB annotation, thus avoiding the use of the JNDI API.
package org.superbiz.injection; import javax.ejb.EJB; import javax.ejb.Stateless; /** * This is an EJB 3.1 style pojo stateless session bean * Every stateless session bean implementation must be annotated * using the annotation @Stateless * This EJB has 2 business interfaces: DataReaderRemote, a remote business * interface, and DataReaderLocal, a local business interface * <p/> * The instance variables 'dataStoreRemote' is annotated with the @EJB annotation: * this means that the application server, at runtime, will inject in this instance * variable a reference to the EJB DataStoreRemote * <p/> * The instance variables 'dataStoreLocal' is annotated with the @EJB annotation: * this means that the application server, at runtime, will inject in this instance * variable a reference to the EJB DataStoreLocal */ //START SNIPPET: code @Stateless public class DataReader { @EJB private DataStoreRemote dataStoreRemote; @EJB private DataStoreLocal dataStoreLocal; @EJB private DataStore dataStore; public String readDataFromLocalStore() { return "LOCAL:" + dataStoreLocal.getData(); } public String readDataFromLocalBeanStore() { return "LOCALBEAN:" + dataStore.getData(); } public String readDataFromRemoteStore() { return "REMOTE:" + dataStoreRemote.getData(); } }
package org.superbiz.injection; import javax.ejb.LocalBean; import javax.ejb.Stateless; /** * This is an EJB 3 style pojo stateless session bean * Every stateless session bean implementation must be annotated * using the annotation @Stateless * This EJB has 2 business interfaces: DataStoreRemote, a remote business * interface, and DataStoreLocal, a local business interface */ //START SNIPPET: code @Stateless @LocalBean public class DataStore implements DataStoreLocal, DataStoreRemote { public String getData() { return "42"; } }
package org.superbiz.injection; import javax.ejb.Local; /** * This is an EJB 3 local business interface * A local business interface may be annotated with the @Local * annotation, but it's optional. A business interface which is * not annotated with @Local or @Remote is assumed to be Local */ //START SNIPPET: code @Local public interface DataStoreLocal { public String getData(); }
package org.superbiz.injection; import javax.ejb.Remote; /** * This is an EJB 3 remote business interface * A remote business interface must be annotated with the @Remote * annotation */ //START SNIPPET: code @Remote public interface DataStoreRemote { public String getData(); }
package org.superbiz.injection; import junit.framework.TestCase; import javax.ejb.embeddable.EJBContainer; import javax.naming.Context; /** * A test case for DataReaderImpl ejb, testing both the remote and local interface */ //START SNIPPET: code public class EjbDependencyTest extends TestCase { public void test() throws Exception { final Context context = EJBContainer.createEJBContainer().getContext(); DataReader dataReader = (DataReader) context.lookup("java:global/injection-of-ejbs/DataReader"); assertNotNull(dataReader); assertEquals("LOCAL:42", dataReader.readDataFromLocalStore()); assertEquals("REMOTE:42", dataReader.readDataFromRemoteStore()); assertEquals("LOCALBEAN:42", dataReader.readDataFromLocalBeanStore()); } }
------------------------------------------------------- T E S T S ------------------------------------------------------- Running org.superbiz.injection.EjbDependencyTest Apache OpenEJB 4.0.0-beta-1 build: 20111002-04:06 http://openejb.apache.org/ INFO - openejb.home = /Users/dblevins/examples/injection-of-ejbs INFO - openejb.base = /Users/dblevins/examples/injection-of-ejbs INFO - Using 'javax.ejb.embeddable.EJBContainer=true' INFO - Configuring Service(id=Default Security Service, type=SecurityService, provider-id=Default Security Service) INFO - Configuring Service(id=Default Transaction Manager, type=TransactionManager, provider-id=Default Transaction Manager) INFO - Found EjbModule in classpath: /Users/dblevins/examples/injection-of-ejbs/target/classes INFO - Beginning load: /Users/dblevins/examples/injection-of-ejbs/target/classes INFO - Configuring enterprise application: /Users/dblevins/examples/injection-of-ejbs INFO - Configuring Service(id=Default Stateless Container, type=Container, provider-id=Default Stateless Container) INFO - Auto-creating a container for bean DataReader: Container(type=STATELESS, id=Default Stateless Container) INFO - Configuring Service(id=Default Managed Container, type=Container, provider-id=Default Managed Container) INFO - Auto-creating a container for bean org.superbiz.injection.EjbDependencyTest: Container(type=MANAGED, id=Default Managed Container) INFO - Enterprise application "/Users/dblevins/examples/injection-of-ejbs" loaded. INFO - Assembling app: /Users/dblevins/examples/injection-of-ejbs INFO - Jndi(name="java:global/injection-of-ejbs/DataReader!org.superbiz.injection.DataReader") INFO - Jndi(name="java:global/injection-of-ejbs/DataReader") INFO - Jndi(name="java:global/injection-of-ejbs/DataStore!org.superbiz.injection.DataStore") INFO - Jndi(name="java:global/injection-of-ejbs/DataStore!org.superbiz.injection.DataStoreLocal") INFO - Jndi(name="java:global/injection-of-ejbs/DataStore!org.superbiz.injection.DataStoreRemote") INFO - Jndi(name="java:global/injection-of-ejbs/DataStore") INFO - Jndi(name="java:global/EjbModule355598874/org.superbiz.injection.EjbDependencyTest!org.superbiz.injection.EjbDependencyTest") INFO - Jndi(name="java:global/EjbModule355598874/org.superbiz.injection.EjbDependencyTest") INFO - Created Ejb(deployment-id=DataReader, ejb-name=DataReader, container=Default Stateless Container) INFO - Created Ejb(deployment-id=DataStore, ejb-name=DataStore, container=Default Stateless Container) INFO - Created Ejb(deployment-id=org.superbiz.injection.EjbDependencyTest, ejb-name=org.superbiz.injection.EjbDependencyTest, container=Default Managed Container) INFO - Started Ejb(deployment-id=DataReader, ejb-name=DataReader, container=Default Stateless Container) INFO - Started Ejb(deployment-id=DataStore, ejb-name=DataStore, container=Default Stateless Container) INFO - Started Ejb(deployment-id=org.superbiz.injection.EjbDependencyTest, ejb-name=org.superbiz.injection.EjbDependencyTest, container=Default Managed Container) INFO - Deployed Application(path=/Users/dblevins/examples/injection-of-ejbs) Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1.225 sec Results : Tests run: 1, Failures: 0, Errors: 0, Skipped: 0