2016-05-31 10 views
3

Ich fand heraus, dass in einem MVC-Muster gibt es hauptsächlich 4 Klassen; der Controller, der Service, der Service Impl und Repo.Code-Architektur der Service-Schnittstelle und Service-Impl Klassen Frühjahr

Der Dienst ist eine Schnittstelle und Service impl implementiert Dienstklasse und enthält alle logischen Codes. Die Struktur wäre so etwas wie: -

Service Interface-Klasse

Service{ 

public void someMethod(); 

} 

ServiceImpl Klasse

ServiceImpl implements Service{ 
    public void someMethod(){ 
    //do something 

    }  
} 

Aber wenn wir die Service-impl-Codes von der Steuerung zugreifen möchten, rufen wir die Methode der Service Klasse wie: -

@Autowired 
Service service; 

Object obj = service.someMethod(); 

Wie führen Sie die Controller-Code von ServiceImpl Klasse

Antwort

4

Dies ist im Grunde, wie Spring funktioniert:

Die Service-Implementierung einen Spring-Bean sein sollte (es entweder eine @Component oder @Service Anmerkung haben, oder sollte definiert werden eine Spring-XML-Konfigurationsdatei), damit Spring sie findet und im Spring-Anwendungskontext registriert.

Dann verwenden Sie Abhängigkeitsinjektion, durch die @Autowired Annotation, um die Implementierung des Dienstes in den Controller zu injizieren. Das bedeutet, dass Spring Ihren Controller überprüft. Er findet die @Autowired Annotation für die Membervariable und initialisiert sie mit einer Bean, die im Anwendungskontext gefunden wird. Dies ist die Instanz der Service-Implementierungsklasse, die zuvor registriert wurde . Nachdem Spring fertig ist, wird sich service auf die Instanz ServiceImpl beziehen.

Siehe Referenz Spring Framework-Dokumentation für Informationen darüber, wie Dependency Injection arbeitet mit Spring: The IoC container

+0

Was passiert also, wenn wir die 'Service'-Schnittstelle mit mehreren Klassen implementieren? Deren Implementierungscode wird ausgeführt. – viper

+1

Wenn Sie mehrere Spring-Beans haben, die 'Service' implementieren, erhalten Sie beim Start der Anwendung einen Fehler, da Spring nicht weiß, welcher ausgewählt werden soll. Es gibt verschiedene Möglichkeiten, Spring mitzuteilen, wie zum Beispiel '@ Qualifier' oder' @ Primary'. – Jesper

+0

Vielen Dank für die Antwort, Sir. Aber warum benutzt der Frühling diese Art von Patttern? Ich denke, in einem normalen 'mvc'-Muster gibt es keine notwendige Rolle einer Interface-Klasse. Es wird nur benötigt, um die 'ServiceImpl'-Klassen zu zwingen, einige Methoden zu implementieren. – viper

1

Wenn Sie die Anmerkung verwenden @Autowired, Frühling wird ein Kandidat in seinem Anwendungskontext automatisch suchen in der zu injizierenden Regler. Ein gültiger Kandidat sollte eine konkrete Klasse sein, die als Spring-Bean markiert ist, unter Verwendung der Anmerkung @Service zum Beispiel.

0

Grundgedanke hinter dieser Art von Architektur ist nur wenig Frühlingskonvention.

Lets morgen sagen, Sie entscheiden, Sie müssen nicht für beide Projekt einzigen Anwendung behalten möchten, und gehen in einen Einsatz für Webapp und eine andere für den Dienst Beispiel Userservice WebApp

so für WebApp Userservice verbinden Es muss HTTP-Anfragen stellen, um irgendwelche Daten zu erhalten. Anschließend müssen Sie den gesamten WebApp-Code ändern, damit er mit neuen Änderungen kompatibel ist. Zum Beispiel rufen Sie statt dessen direkt die Methode des Dienstes an, indem Sie httpClient aufrufen. Um diese Nacharbeit zu vermeiden, können Sie mit dem Interface-Service Ihren eigenen ServiceImpl implementieren und alle http-Anfragen in ihrem, Rest bleiben intakt.

Ähnliches wird in UserService gemacht, es wird auf ServiceImpl wie vorher haben, aber wird Controller als Singleton-Objekt aufgerufen.