© DrHitch/Shutterstock.com
Shortcuts
CDI

17 CDI in SE-Umgebungen


CDI ist nicht an eine Enterprise-Umgebung gebunden. Vielmehr können CDI Container auch außerhalb eines Java-EE-Servers in einer Standalone-Umgebung gestartet werden. Neben der Nutzung im eigentlichen Anwendungskontext macht das auch Unit Tests direkt in der Entwicklungsumgebung möglich.

Der Start des Containers ist abhängig von der genutzten Implementierung. JBoss Weld lässt sich bspw. mit dem in Listing 17.1 gezeigten Codeausschnitt starten. Der Container bietet eine Methode select vergleichbar mit der aus BeanManager an, mit der die gewünschten Beans instanziiert und benutzt werden können. Am Ende der Nutzung kann der Server per shutdown heruntergefahren werden.

// Weld Container starten
Weld weld = new Weld();
WeldContainer weldContainer = weld.initialize();

// Nutzung von CDI Beans
SomeBean bean = weldContainer.instance().select(SomeBean.class).get();
bean.doSomething();

// Weld stoppen
weld.shutdown();

Listing 17.1: Nutzung von JBoss Weld außerhalb eines Java-EE-Servers

Mit Ausnahme der Initialisierung des Containers unterscheidet sich eine CDI-Anwendung in einer SE-Umgebung zunächst nicht von einer im Application Server, d. h. alle gezeigten Mechanismen wie Injektion, Producer etc. funktionieren so wie gezeigt.

Unterschiede bestehen einerseits hinsichtlich der Java-EE-Ressourcen wie Datasources, JTA-Transaktion etc., die ebenso wie weitere Java-EE-Komponenten in der SE-Umgebung nicht zur Verfügung stehen. Andererseits sind auch die verschiedenen Kontexte nicht per se aktiv, d. h. sie müssen bei Bedarf gestartet werden. Die Container bieten dazu proprietäre APIs an.

Bequemer und portabler als die Nutzung des containerspezifischen API ist allerdings die Verwendung des Moduls „Container Control“ aus Apache DeltaSpike: Hiermit können Containerstart, Kontextaktivierung, Bean Lookup und Container-Shutdown vollkommen unabhängig vom konkret genutzten Container implementiert werden (Listing 17.2).

// CDI Container starten
CdiContainer cdiContainer = CdiContainerLoader.getCdiContainer();
cdiContainer.boot();

// Kontexte starten
ContextControl contextControl = cdiContainer.getContextControl();
contextControl.startContext(RequestScoped.class);
contextControl.startContext(SessionScoped.class);


// CDI Bean nutzen
SomeBean bean = BeanProvider.getContextualReference(SomeBean.class);
bean.doSomething();

// CDI Container stoppen
cdiContainer.shutdown();

Listing 17.2: Containerneutrale Nutzung von CDI im SE-Umfeld mithilfe von DeltaSpike

Der zu nutzende Container muss sich (als einzig...

Shortcuts
CDI

17 CDI in SE-Umgebungen

CDI ist nicht an eine Enterprise-Umgebung gebunden. Vielmehr können CDI Container auch außerhalb eines Java-EE-Servers in einer Standalone-Umgebung gestartet werden. Neben der Nutzung im eigentlichen Anwendungskontext macht das auch Unit Tests direkt in der Entwicklungsumgebung möglich.

Shortcut Autorenteam


CDI ist nicht an eine Enterprise-Umgebung gebunden. Vielmehr können CDI Container auch außerhalb eines Java-EE-Servers in einer Standalone-Umgebung gestartet werden. Neben der Nutzung im eigentlichen Anwendungskontext macht das auch Unit Tests direkt in der Entwicklungsumgebung möglich.

Der Start des Containers ist abhängig von der genutzten Implementierung. JBoss Weld lässt sich bspw. mit dem in Listing 17.1 gezeigten Codeausschnitt starten. Der Container bietet eine Methode select vergleichbar mit der aus BeanManager an, mit der die gewünschten Beans instanziiert und benutzt werden können. Am Ende der Nutzung kann der Server per shutdown heruntergefahren werden.

// Weld Container starten
Weld weld = new Weld();
WeldContainer weldContainer = weld.initialize();

// Nutzung von CDI Beans
SomeBean bean = weldContainer.instance().select(SomeBean.class).get();
bean.doSomething();

// Weld stoppen
weld.shutdown();

Listing 17.1: Nutzung von JBoss Weld außerhalb eines Java-EE-Servers

Mit Ausnahme der Initialisierung des Containers unterscheidet sich eine CDI-Anwendung in einer SE-Umgebung zunächst nicht von einer im Application Server, d. h. alle gezeigten Mechanismen wie Injektion, Producer etc. funktionieren so wie gezeigt.

Unterschiede bestehen einerseits hinsichtlich der Java-EE-Ressourcen wie Datasources, JTA-Transaktion etc., die ebenso wie weitere Java-EE-Komponenten in der SE-Umgebung nicht zur Verfügung stehen. Andererseits sind auch die verschiedenen Kontexte nicht per se aktiv, d. h. sie müssen bei Bedarf gestartet werden. Die Container bieten dazu proprietäre APIs an.

Bequemer und portabler als die Nutzung des containerspezifischen API ist allerdings die Verwendung des Moduls „Container Control“ aus Apache DeltaSpike: Hiermit können Containerstart, Kontextaktivierung, Bean Lookup und Container-Shutdown vollkommen unabhängig vom konkret genutzten Container implementiert werden (Listing 17.2).

// CDI Container starten
CdiContainer cdiContainer = CdiContainerLoader.getCdiContainer();
cdiContainer.boot();

// Kontexte starten
ContextControl contextControl = cdiContainer.getContextControl();
contextControl.startContext(RequestScoped.class);
contextControl.startContext(SessionScoped.class);


// CDI Bean nutzen
SomeBean bean = BeanProvider.getContextualReference(SomeBean.class);
bean.doSomething();

// CDI Container stoppen
cdiContainer.shutdown();

Listing 17.2: Containerneutrale Nutzung von CDI im SE-Umfeld mithilfe von DeltaSpike

Der zu nutzende Container muss sich (als einzig...

Angebote für Teams

Für Firmen haben wir individuelle Teamlizenzen. Wir erstellen Ihnen gerne ein passendes Angebot.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang