# [EJB Injektion] Verständnisfrage



## ratnalein (21. Apr 2014)

Hallo zusammen,

dass EJB-Technologie auf RMI-Konzept basiert, habe ich soweit verstanden(Methodenaufruf auf einer anderen JVM).  Nun verstehe ich noch eine Sache nicht:


```
@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();
    }
}
```

Das obige Bean bietet 3 Methoden an, die vom Client aufgerufen werden können.  Desweiteren werden 3 EJBs injiziert.  

Kann man eigentlich statt @EJB auch eine new-Methode aufrufen?  Also:
Statt

```
@EJB
private DataStore dataStore;
```

einfach 
	
	
	
	





```
DataStore meinDataStore = new (DataStore);
```

Ich verstehe das so:
diese Injektionen finden ja lokal im Applikationsserver bzw. innerhalb des Beans "DataReader" statt, ich könnte doch eigentlich die Instantiierung von jeweils DataStoreRemote, DataStoreLocal und DataStore auch per new() implementieren?

Vielen Dank für Eure Hilfestellungen.

Viele Grüße aus Rheinland,

Eure Ratna


----------



## number8 (6. Mai 2014)

Mmh. Naja, also wenn man die Beans mit new instanziiert, dann sind die eben auch nicht vom Container verwaltet was u.a. auch zB fehlende Transaktionskontrolle bedeutet.


----------



## Hootch (23. Mai 2014)

Eine @Annotation ist eine Auszeichnung für ein vereinbartes Verhalten oder Zustand, d.h. @Stateless oder @EJB unterliegt bestimmten Regeln. Der Server erzeugt das "new" damit er diese Vereinbarung auch halten kann.

Man nutzt hier das IoC (Inverse of Control) / Dependency Injection. Mit einem eigenen "new" erzeugt man nur die Instanz eines Objektes. Im einfachsten Fall ist das nur ein POJO.

In Testklassen kann man mit new ObjektXY() die Algo's testen die unabhängig von Dritt-Diensten lauffähig sind (Datenbank, Services, JMS etc.)

Das vereinfacht Tests und den Integrationsaufwand.


----------

