0

Ich habe einige Erfahrung in Spring Framework. Spring machen normalerweise die DI unter Verwendung der constructor injection oder setter injection. Mit diesem Konzept bin ich zufrieden. Nun, zusätzlich dazu, ich habe das Frühlings wie dies tun DI gesehen:Möglichkeiten, in denen Frühling Dependency-Injektion

@Autowired 
DataSource myData; 

ODER

@Resouce(name="someName") 
SomeDependency dependency; 

Welche Mechanismus tun Frühling verwenden, wenn es Anmerkungen verwendet die DI zu tun? Verwendet Spring in diesen Fällen constructor oder setter Injection oder ist Annotations-Ansatz insgesamt eine andere Möglichkeit, die Abhängigkeiten zu injizieren?

Jede Erklärung in einfachen Welten wäre eine große Hilfe.

+2

Weder noch. Das nennt man Feldinjektion und sollte möglichst vermieden werden (imho das ist) (siehe http://olivergierke.de/2013/11/why-field-injection-is-evil/) –

+0

@M.Deinum: Danke für Ihre Eingaben Ich habe jedoch gesehen, dass dieser Ansatz weit verbreitet ist. Also wundern Sie sich, was passiert hinter den Kulissen der Annotation Ansatz. – CuriousMind

+1

Die Tatsache, die weit verbreitet ist, bedeutet nicht, dass es eine gute Annäherung ist ... –

Antwort

1

Sie können Setter Injektion und Konstruktor Injektion von @Autowired bedeutet.

@Autowired 
private Person person; 

@Autowired 
public Customer(Person person) { 
    this.person = person; 
} 

standardmäßig autowired von TYPE Bohnen injizieren. Hinter der Szene macht es Injektion über Java Reflektionsmechanismus. So können Sie die gleichen Dinge (die Sie mit XML-Konfiguration getan haben) mit Annotation Config tun.

Zusätzlich hinzufügen möchten, dass Konstruktor Injektion vorzuziehen ist (außer Fälle, in denen es zu viele Argumente gibt). Hauptvorteil der Konstruktorinjektion:

  • Sie können nicht vermeiden, Argumente an Konstruktor übergeben und Bean ohne sie erstellen.
  • Also in den meisten Fällen möchten Sie die Abhängigkeit injiziert werden, während Setter Injektion es nicht garantiert (Sie können diese lästige NPE, die während der falschen Setter Injektion erscheint).

    Spezifische Regeln von autowired mit: http://docs.spring.io/spring/docs/4.2.7.RELEASE/javadoc-api/org/springframework/beans/factory/annotation/Autowired.html

    +0

    Dies ist in Bezug auf die erste Zeile des Codes in Ihrem Beispiel, was Feder tun wird? ruft es den Setter des Personenobjekts für diese Kundenklasse für DI auf? – tinku

    +1

    Setter sind nicht notwendig, weil der Frühling Reflexion verwendet. Und Sie können sogar PRIVATE Felder ohne Setter automatisch ansteuern. –

    +0

    Danke @Ivan, ich habe versucht, das Ding zu verstehen. Ich habe Autowire auf einem meiner privaten Feld und Setter ist auch dort für dieses private Feld, aber während der Ausführung meiner Anwendung, die Setter nicht ausgeführt wird. – tinku