In Spring Boot werden nach der Registrierung aller Beans im DI-Container die Beans ausgeführt, die die CommandLineRunner-Schnittstelle implementieren. Auf diese Weise ist es möglich, eine Erstverarbeitung zu implementieren, z. B. das Registrieren von Daten in der Datenbank beim Start. Die Methode ist einfach. Implementieren Sie einfach die CommandLineRunner-Schnittstelle und registrieren Sie die Klasse, die den Prozess beschreibt, den Sie in der run-Methode ausführen möchten, im DI-Container. Hier wird @Component als Beispiel verwendet. Im folgenden Beispiel wird beim Start in der Entwicklungsumgebung (Profile = "dev") die Repository-Klasse verwendet und die Anfangsdaten werden in der Datenbank gespeichert.
@Component
@Profile(value = ["dev"]) //Für Entwicklungsumgebungsprofil ausführen
class DevDataInitializer(@Autowired private val greetingRepository: GreetingRepository) : CommandLineRunner {
private val logger = LoggerFactory.getLogger(javaClass)
override fun run(vararg args: String?) {
logger.info("${this.javaClass.simpleName} Run")
greetingRepository.save(Greeting(value = "Dev!!!"))
}
}
Die folgende Klasse ist ein Beispiel, daher hat der Prozess keine besondere Bedeutung. Repository-Klasse
import com.example.springsecuritydemo.domain.Greeting
import org.springframework.data.jpa.repository.JpaRepository
import org.springframework.stereotype.Repository
@Repository
interface GreetingRepository: JpaRepository<Greeting, Long>
Entitätsklasse
import org.springframework.data.jpa.domain.support.AuditingEntityListener
import javax.persistence.*
@EntityListeners(AuditingEntityListener::class)
@Entity
@Table(name = "greeting")
data class Greeting(
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
var id: Long = 0,
@Column(name = "value")
val value: String = ""
)
Bei der Registrierung von Klassen, die mehrere CommandLineRunner im DI-Container implementieren, kann die Ausführungsreihenfolge jeder Klasse mit @Order angegeben werden. Geben Sie die Ausführungsreihenfolge mit dem Argument @Order an (siehe unten).
import com.example.springsecuritydemo.domain.Greeting
import com.example.springsecuritydemo.repository.GreetingRepository
import org.slf4j.LoggerFactory
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.CommandLineRunner
import org.springframework.context.annotation.Profile
import org.springframework.core.annotation.Order
import org.springframework.stereotype.Component
@Component
@Order(1)
@Profile(value = ["dev"])
class DevDataInitializer(@Autowired private val greetingRepository: GreetingRepository) : CommandLineRunner {
private val logger = LoggerFactory.getLogger(javaClass)
override fun run(vararg args: String?) {
logger.info("${this.javaClass.simpleName} Run")
greetingRepository.save(Greeting(value = "Dev!!!"))
}
}
import com.example.springsecuritydemo.domain.Greeting
import com.example.springsecuritydemo.repository.GreetingRepository
import org.slf4j.LoggerFactory
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.CommandLineRunner
import org.springframework.context.annotation.Profile
import org.springframework.core.annotation.Order
import org.springframework.stereotype.Component
@Component
@Order(2)
@Profile(value = ["dev"])
class DevDataInitializer2(@Autowired private val greetingRepository: GreetingRepository): CommandLineRunner {
private val logger = LoggerFactory.getLogger(javaClass)
override fun run(vararg args: String?) {
logger.info("${this.javaClass.simpleName} Run")
greetingRepository.save(Greeting(value = "Dev2!!!"))
}
}
Wenn Sie sich das Protokoll beim Start ansehen, können Sie sehen, dass sie in der angegebenen Reihenfolge ausgeführt werden.
Recommended Posts