Ich habe mit Kotlin eine serverseitige Anwendung erstellt, die jedoch noch nicht ordnungsgemäß konfiguriert ist. Erstellen Sie eine Controller-Klasse mit "Kotorin und Spring Mone - 2. RestController und Datenklasse", und die Konfiguration ist weiterhin so, dass Daten direkt verarbeitet werden. Daher werden wir nach und nach Änderungen vornehmen. Betrachten wir zunächst die Ebene "** service **".
Webanwendungen sind grob in die folgenden Funktionen unterteilt.
--Anforderungs- / Antwortverarbeitung
Bisher wurden diese Funktionen in einer einzigen Schicht behandelt. Mit dieser Konfiguration erhöht sich die zu handhabende Logik und das Datenmodell wird kompliziert. Eine Klasse wird riesig und die Entwicklungs- / Wartungseffizienz verschlechtert sich.
Trennen Sie jede Funktion und teilen Sie sie in mehrere Ebenen auf.
Die Klasse, die ich gemacht habe, ist übrigens "RestController". Ursprünglich liegt es in der Verantwortung, Anfragen / Antworten zu bearbeiten. Daher wird die andere Verarbeitung unterbrochen und als ** Dienst ** bezeichnet.
Spring Dependencies
Ursprünglich habe ich andere Dinge als die Anforderungs- / Antwortverarbeitung ausgeführt, z. B. die Datengenerierung in der Controller-Klasse wie folgt.
@RestController
@RequestMapping("/messages")
class SimpleController {
@GetMapping
fun getMessages() : List<Message> {
return listOf(
Message(
UUID.randomUUID().toString(),
"First Message",
"This is a 1st message on ${getDate()}."
),
Message(UUID.randomUUID().toString(),
"Second Message",
"This is a 2nd message on ${getDate()}."
)
)
}
private fun getDate() : String {
val simpleDateFormat = SimpleDateFormat("yyyy/MM/dd HH:mm:ss")
return simpleDateFormat.format(Date())
}
}
Verschieben Sie den ursprünglich in der Controller-Klasse implementierten Inhalt wie folgt in die Service-Klasse.
@Service("Message Service")
class MessageService {
fun getMessages() : List<Message> {
return listOf(
Message(
UUID.randomUUID().toString(),
"First Message",
"This is a 1st message on ${getDate()}."
),
Message(UUID.randomUUID().toString(),
"Second Message",
"This is a 2nd message on ${getDate()}."
)
)
}
private fun getDate() : String {
val simpleDateFormat = SimpleDateFormat("yyyy/MM/dd HH:mm:ss")
return simpleDateFormat.format(Date())
}
}
Kommentieren Sie die Serviceklasse mit dem "@ Service". Dies macht es durch Dependency Injection in der Controller-Klasse verfügbar.
@Autowired
private lateinit var service: MessageService
Das Schlüsselwort lateinit
wird verwendet, um eine Instanz zu deklarieren, ohne sie zu initialisieren.
Controller-Klassen, die Serviceklassen verwenden, sollten nur für die Anforderungs- / Antwortverarbeitung verantwortlich sein. Nehmen Sie die folgenden Änderungen vor, um den in der Serviceklasse implementierten Prozess aufzurufen.
@RestController
@RequestMapping("/messages")
class MessageController() {
@Autowired
private lateinit var service: MessageService
@GetMapping
fun getMessages() = service.getMessages()
}
Das Entwickeln von Anwendungen mit separaten Ebenen für jede Verantwortung ist jetzt ein Standard. In diesem Zustand wird die Datenverarbeitung jedoch direkt von der Serviceschicht aus durchgeführt Als nächstes werden wir diesen Teil trennen.
Recommended Posts