Dans Spring Boot, une fois que tous les beans sont enregistrés dans le conteneur DI, les beans qui implémentent l'interface CommandLineRunner sont exécutés. En utilisant cela, il est possible d'implémenter un traitement initial tel que l'enregistrement de données dans la base de données au démarrage. La méthode est simple, implémentez simplement l'interface CommandLineRunner et enregistrez la classe qui décrit le processus que vous souhaitez exécuter dans la méthode d'exécution dans le conteneur DI. Ici, @Component est utilisé comme exemple. Dans l'exemple ci-dessous, lors du démarrage dans l'environnement de développement (Profile = "dev"), la classe du référentiel est utilisée et les données initiales sont enregistrées dans la base de données.
@Component
@Profile(value = ["dev"]) //Exécuter pour le profil d'environnement de développement
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!!!"))
}
}
La classe suivante est un exemple, il n'y a donc pas de signification particulière dans le processus. Classe de référentiel
import com.example.springsecuritydemo.domain.Greeting
import org.springframework.data.jpa.repository.JpaRepository
import org.springframework.stereotype.Repository
@Repository
interface GreetingRepository: JpaRepository<Greeting, Long>
Classe d'entité
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 = ""
)
Lors de l'inscription de classes qui implémentent plusieurs CommandLineRunner dans le conteneur DI, l'ordre d'exécution de chaque classe peut être spécifié avec @Order. Spécifiez l'ordre d'exécution avec l'argument @Order comme indiqué ci-dessous.
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!!!"))
}
}
Si vous regardez le journal au démarrage, vous pouvez voir qu'ils sont exécutés dans l'ordre spécifié.
Recommended Posts