# Injection?



## mario87b (9. Okt 2012)

Hallo.

Ich habe folgenden Code.


```
...

@ManagedBean(name="telefon")
@ViewScoped
public class Telefonbuch {
   @ManagedProperty(value="#{eintrag}")
   private Message message;

}


@ManagedBean(name="eintrag")
@SessionScoped
public class MessageBean {
 
	//blabla 
}
...
```

Mittels der Annotation @ManagedProperty injecte ich ja irgendwas, aber ich habs nicht wirklich verstanden. Mein Object der Klasse Message erzeuge ich doch wie ichs kenne?

Kann mir bitte jemand mit normales Worten erklären, was genau hinter der Injection Geschichte steckt. Ich hab via google soviel gelesen und nichts verstanden, außer das es irgendwas mit der Lebensdauer zu tun hat. Gleich vorneweg, die Scopes sind mit bekannt und das hab ich auch verstanden...

Danke.


----------



## Ullenboom (9. Okt 2012)

Injizierung ist wie beim Arzt: nicht DU gibst dir die Spritze sondern der Arzt. Du sitzt nur da und lässt es passieren. So ist das hier auch. Das Framwork injiziert das Message-Objekt in dein Objekt. Das Telefonbuch ist also schon mit einem Verweis auf Message ausgestattet ohne das du dich drum kümmern musst.


----------



## mario87b (9. Okt 2012)

mh, soll heißen ich brauche kein


```
private Message message;
```

??


----------



## Sym (10. Okt 2012)

Doch, wenn Du in Telefonbuch auf MessageBean zugreifen möchtest, benötigst Du 

```
@ManagedProperty(value="#{eintrag}")
private MessageBean message;
```
Aber ich glaube, ich verstehe die Frage nicht ganz.

edit: ich meine in Plain-JSF-2 benötigst Du dann auch zumindest den Setter für das Feld.


----------



## sence (10. Okt 2012)

für injection ist die Annotation @Inject zuständig.
Damit kannst du "automatisch" andere Objekte in die Bean laden, die z.B. in der Session liegen.

Sagen wir du hast 2 Objekte:
- Person
- Useraccount

Eine Verwaltungs Bean:
- Manager

wenn du nun z.B.

@Inject
private Useraccount useraccount

in der Verwaltungsbean hast, wird der Useraccount automatisch injeziert.
Andernfalls musst du dir das Useraccount objekt selbst aus der Session holen:
FacesContext ctx = FacesContext.getCurrentInstance();
ELContext el = ctx.getELContext();
Useraccount useraccount = (Useraccount) el.getELResolver().getValue(el, null, "useraccount");   

-------------------------------------------------------------------------------------------------------

mit @ManagedProperty werden nur GET Parameter an die Bean Property gebunden.
also ähnlich den ViewParameter (?myid=10) wird automatisch in z.B.:

private int myid; 

"gebunden" ich will jetzt nicht injeziert sagen, da für mich persönlich sich Injezieren eher der Context Bezug von Objekte handelt.

java - ViewParam vs @ManagedProperty(value = "#{param.id}") - Stack Overflow
Kommentar von Balus beachten


----------



## Sym (10. Okt 2012)

@Inject ist die Injection-Annotation von CDI, welches häufig verwendet wird. 
@ManagedProperty ist Plain-JSF2


----------



## sence (10. Okt 2012)

d.h Sym ich kann mit der ManagedProperty mir automatisch die Objekte aus den "höher wertigen" Scopes holen, wie ich es eben mit @Inject von cdi ausgesprochen habe ? :rtfm:

also
@ManagedProperty(value="#{useraccount}")
private Useraccount useraccount


----------



## Sym (10. Okt 2012)

Mit @ManagedProperty kannst Du Dir wie mit @Inject andere Beans injizieren. Dafür ist die Annotation da. Inject ist die CDI-Annotation. Beim Release von JSF2 war CDI noch nicht final, deshalb gibt es dort eigene Annotationen. Allerdings wird häufig zur Nutzung von CDI geraten, da dies flexibler (und eigentlich Standard für JSF) ist. Mit JSF 2.2 wird CDI ein tiefer Bestandteil des Frameworks sein.


----------

