Ich nehme ein Beispiel aus den Kommentaren: Warum SpringApplication.run(Application.class, args);
anstelle von SpringApplication.run(this, args);
?
Ich habe eigentlich Spring nicht verwendet, also bin ich mir nicht sicher, das ist eine korrekte Beschreibung wie Spring Dependency Injection aufruft, aber es sollte dazu dienen, die Frage unabhängig zu beantworten.
Zunächst wird diese Methode typischerweise von main
aufgerufen. Genauer gesagt, von public static void main
. Das ist eine static
Methode, und this
existiert nicht in denen. Also müsste es stattdessen SpringApplication.run(new Application(), args);
sein.
Aber was, wenn der Konstruktor von Application
wie public Application(Something dependency1, AnotherThing dependency2, SomethingElse dependency3)
aussieht? Sie müssten jedes dieser Abhängigkeitsobjekte an erster Stelle setzen, und sie könnten auch ihre eigenen Abhängigkeiten haben. Sie würden diese riesige Sequenz von Dutzenden von Zeilen zum Erstellen neuer Objekte erhalten und sie an die Konstruktoren von mehr neuen Objekten übergeben.
SpringApplication.run(Application.class, args);
ist eine einzige kurze Zeile, egal, was der Application
Konstruktor aussieht, und es ist speziell entwickelt, um all diese Dutzende von erforderlichen Objekten für Sie herauszufinden und zu machen. Es schaut auf Application
's Konstruktor und sieht diese Liste von drei Argumenten, schaut sich diese Klassen an, findet ihre Konstruktoren, schaut sich die Argumentenlisten dieser Konstruktoren an, bis es genug Informationen hat, um das ganze große Chaos für Sie zusammen zu bringen. Alles aus einem kurzen Methodenaufruf. Das Erfordernis, dass Sie eine bereits erstellte Instanz von Application
und nicht die Klasse übergeben, würde den Sinn verneinen, und die Klasse ist alles, was sie tatsächlich benötigt.
Es gibt sehr viele andere Dinge, die mit einer Klasse getan werden können, wo die Verwendung einer Instanz stattdessen unnötig wäre oder sogar die gewünschte Funktionalität tatsächlich bricht, dies ist nur ein Beispiel dafür.
Da erstellt man eine Instanz von 'someclass', die andere nicht. Es wird sehr oft im Umgang mit Generika und Mapping verwendet. Beachten Sie, dass 'someclass.class' ebenfalls eine Instanz ist, eine Instanz von' Class'. – luk2302
'new someclass()' ist ein Aufruf an einen Konstruktor. Niemand versichert Ihnen, dass dieser Konstruktor öffentlich ist oder dass er überhaupt existiert (es könnte einen Parameter erfordern). Warum würden Sie eine Instanz einer Klasse erstellen, wenn Sie nur den Typ benötigen? – Oneiros
@ luk2302 Ja, explizit, aber Sie können den Klassentyp verwenden, um eine Klasse zu instanziieren. Meine Frage lautet also, warum der Klassentyp und nicht die Klasse oder irgendeine Schnittstellendarstellung der Klasse übergeben wird? Was sind die Vorteile der Weitergabe der Klasse? – user3416682