| Title: Injection of other EJBs Example |
| <a name="InjectionofotherEJBsExample-Overview"></a> |
| # Overview |
| |
| This example shows how to use the *@EJB* annotation in a bean class to |
| refer to other beans. |
| |
| This functionality is often referred as dependency injection, and has been |
| introduced in Java EE 5. |
| |
| In this particular example, we will create two session stateless beans: |
| |
| - DataStore session bean |
| - DataReader session bean |
| |
| 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. |
| |
| _The source for this example is the "injection-of-ejbs" directory located |
| in the [openejb-examples.zip](openejb:download.html) |
| available on the [download page](http://tomee.apache.org/downloads.html)._ |
| |
| <a name="InjectionofotherEJBsExample-TheCode"></a> |
| # The Code |
| |
| In this example we develop two simple session stateless beans (DataReader |
| and DataStore), and show how we can use the @EJB annotation in one of these |
| beans to get the reference to the other session bean |
| |
| <a name="InjectionofotherEJBsExample-DataStoresessionbean"></a> |
| ## DataStore session bean |
| |
| <a name="InjectionofotherEJBsExample-Bean"></a> |
| ### Bean |
| |
| {snippet:id=code|url=openejb3/examples/injection-of-ejbs/src/main/java/org/superbiz/injection/DataStoreImpl.java|lang=java} |
| |
| <a name="InjectionofotherEJBsExample-Localbusinessinterface"></a> |
| ### Local business interface |
| |
| {snippet:id=code|url=openejb3/examples/injection-of-ejbs/src/main/java/org/superbiz/injection/DataStoreLocal.java|lang=java} |
| |
| <a name="InjectionofotherEJBsExample-Remotebusinessinterface"></a> |
| ### Remote business interface |
| |
| {snippet:id=code|url=openejb3/examples/injection-of-ejbs/src/main/java/org/superbiz/injection/DataStoreRemote.java|lang=java} |
| |
| <a name="InjectionofotherEJBsExample-DataReadersessionbean"></a> |
| ## DataReader session bean |
| |
| <a name="InjectionofotherEJBsExample-Bean"></a> |
| ### Bean |
| |
| {snippet:id=code|url=openejb3/examples/injection-of-ejbs/src/main/java/org/superbiz/injection/DataReaderImpl.java|lang=java} |
| |
| Note the usage of the *@EJB* annotation on the DataStoreRemote and |
| DataStoreLocal fields. This is the minimum required for EJB ref |
| resolution. If you have two beans that implement the same business |
| interfaces, you'll want to the *beanName* attribute as follows: |
| |
| @EJB(beanName = "DataStoreImpl") |
| private DataStoreRemote dataStoreRemote; |
| |
| @EJB(beanName = "DataStoreImpl") |
| private DataStoreLocal dataStoreLocal; |
| |
| |
| <a name="InjectionofotherEJBsExample-Localbusinessinterface"></a> |
| ### Local business interface |
| |
| {snippet:id=code|url=openejb3/examples/injection-of-ejbs/src/main/java/org/superbiz/injection/DataReaderLocal.java|lang=java} |
| |
| (The remote business interface is not shown for the sake of brevity). |
| |
| {tip:title=@EJB annotation} |
| Several components in Java EE can use the @EJB annotation, such as: |
| * Servlets |
| * ServletContextListeners |
| * Servlet Filters |
| * JSF managed beans |
| * EJB interceptors |
| * JAX-WS service endpoints |
| {tip} |
| |
| <a name="InjectionofotherEJBsExample-Writingaunittestfortheexample"></a> |
| # Writing a unit test for the example |
| |
| Writing an unit test for this example is quite simple. We need just to |
| write a setup method to create and initialize the InitialContext, and then |
| write our test methods |
| |
| {snippet:id=code|url=openejb3/examples/injection-of-ejbs/src/test/java/org/superbiz/injection/EjbDependencyTest.java|lang=java} |
| |
| <a name="InjectionofotherEJBsExample-Running"></a> |
| # Running |
| |
| Running the example is fairly simple. In the "injection-of-ejbs" directory |
| of the [examples zip](openejb:download.html) |
| , just run: |
| |
| > $ mvn clean install |
| |
| Which should create output like the following. |
| |
| |
| ------------------------------------------------------- |
| T E S T S |
| ------------------------------------------------------- |
| Running org.superbiz.injection.EjbDependencyTest |
| Apache OpenEJB 3.0 build: 20080408-04:13 |
| http://tomee.apache.org/ |
| INFO - openejb.home = |
| /Users/dblevins/work/openejb-3.0/examples/injection-of-ejbs |
| INFO - openejb.base = |
| /Users/dblevins/work/openejb-3.0/examples/injection-of-ejbs |
| 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 - Configuring Service(id=Default JDK 1.3 ProxyFactory, |
| type=ProxyFactory, provider-id=Default JDK 1.3 ProxyFactory) |
| INFO - Found EjbModule in classpath: |
| /Users/dblevins/work/openejb-3.0/examples/injection-of-ejbs/target/classes |
| INFO - Configuring app: |
| /Users/dblevins/work/openejb-3.0/examples/injection-of-ejbs/target/classes |
| INFO - Configuring Service(id=Default Stateless Container, type=Container, |
| provider-id=Default Stateless Container) |
| INFO - Auto-creating a container for bean DataReaderImpl: |
| Container(type=STATELESS, id=Default Stateless Container) |
| INFO - Loaded Module: |
| /Users/dblevins/work/openejb-3.0/examples/injection-of-ejbs/target/classes |
| INFO - Assembling app: |
| /Users/dblevins/work/openejb-3.0/examples/injection-of-ejbs/target/classes |
| INFO - Jndi(name=DataReaderImplLocal) --> Ejb(deployment-id=DataReaderImpl) |
| INFO - Jndi(name=DataReaderImplRemote) --> |
| Ejb(deployment-id=DataReaderImpl) |
| INFO - Jndi(name=DataStoreImplLocal) --> Ejb(deployment-id=DataStoreImpl) |
| INFO - Jndi(name=DataStoreImplRemote) --> Ejb(deployment-id=DataStoreImpl) |
| INFO - Created Ejb(deployment-id=DataReaderImpl, ejb-name=DataReaderImpl, |
| container=Default Stateless Container) |
| INFO - Created Ejb(deployment-id=DataStoreImpl, ejb-name=DataStoreImpl, |
| container=Default Stateless Container) |
| INFO - Deployed |
| Application(path=/Users/dblevins/work/openejb-3.0/examples/injection-of-ejbs/target/classes) |
| Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.705 sec |
| |
| Results : |
| |
| Tests run: 2, Failures: 0, Errors: 0, Skipped: 0 |
| |
| |
| |