Kurs Springa – część 3 – Wprowadzanie danych inicjalnych do aplikacji

Każda aplikacja webowa potrzebuje danych, żeby przynajmniej działać. Bez danych użytkownika nie będzie można przecież przetestować logowania, edycji, czy wyświetlania tychże. Kroki do uzyskania są dwa – sumienne wklepywanie danych po każdorazowym uruchomieniu aplikacji (rejestracja, dodawanie np. faktur, innych użytkowników, ról systemowych etc.), lub dodanie do aplikacji danych inicjalnych, danych testowych.

Klasa (lub paczka), która odpowiedzialna jest za tworzenie takich właśnie inicjalnych danych, nazywana jest klasą bootstrapową. Spring umożliwia tworzenie takich klas, posiadając komponent odpowiedzialny za reagowanie na zdarzenia (ang. events), które mają miejsce w aplikacji. Jednym z takich zdarzeń może być “wstanie”, czyli bezproblemowe uruchomienie serwera aplikacyjnego i osadzenia na nim naszej appki.

Spróbujemy w takim razie napisać metodę działającą w formie listenera (słuchacza), która nasłuchiwać będzie zdarzeń w naszej aplikacji. Metoda taka często nazywana jest event listenerem. Polegać to będzie na tym, że metoda czekać będzie na informację z serwera, że wszystko uruchomiło się prawidłowo i jest gotowe do użycia. W momencie, gdy taka informacja nadejdzie, metoda zostanie uruchomiona i wykonają się wszystkie zapisane w niej operacje. W tym przypadku – dodanie do bazy odpowiednich rekordów.

package it.gniado.spring5webapp.bootstrap;

import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.stereotype.Component;

import it.gniado.spring5webapp.model.Author;
import it.gniado.spring5webapp.repositories.AuthorRepository;
import it.gniado.spring5webapp.repositories.PublisherRepository;
import it.gniado.spring5webapp.model.Book;
import it.gniado.spring5webapp.model.Publisher;
import it.gniado.spring5webapp.repositories.BookRepository;

@Component
public class DevBootstrap implements ApplicationListener<ContextRefreshedEvent> {

    private AuthorRepository authorRepository;
    private BookRepository bookRepository;
    private PublisherRepository publisherRepository;

    public DevBootstrap(AuthorRepository authorRepository, BookRepository bookRepository, PublisherRepository publisherRepository) {
        this.authorRepository = authorRepository;
        this.bookRepository = bookRepository;
        this.publisherRepository = publisherRepository;
    }

    private void initData(){

        Author eric = new Author("Eric", "Evans");
        Publisher harper = new Publisher("Harper Collins", "Nevada 7");
        Book ddd = new Book("Domain Driven Design", "1234", harper);
        eric.getBooks().add(ddd);
        ddd.getAuthors().add(eric);

        authorRepository.save(eric);
        publisherRepository.save(harper);
        bookRepository.save(ddd);

        Author rod = new Author("Rod", "Johnson");
        Publisher worx = new Publisher("Worx", "Illinois 8");
        Book noEjb = new Book("J2EE Development without EJB", "23444", worx);
        rod.getBooks().add(noEjb);
        noEjb.getAuthors().add(rod);

        authorRepository.save(rod);
        publisherRepository.save(worx);
        bookRepository.save(noEjb);
    }

    @Override
    public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
        initData();
    }
}

To, co mamy powyżej to kod klasy bootstrapowej DevBootstrap. Klasa oznaczona jest adnotacją @Component oraz implementuje interfejs ApplicationListener umożliwiający nasłuchiwanie eventów aplikacji. ContextRefreshedEvent to, według oficjalnej dokumentacji Springa, event, który ma miejsce w momencie uruchomienia lub odświeżenia całej aplikacji. W momencie, gdy taki event nastąpi – uruchomiona zostanie metoda onApplicationEvent, która z kolei odpali naszą metodę prywatną initData.

Odpalmy naszą aplikację i sprawdźmy co pojawi się w bazie danych.

Dane z DevBootstrap pomyślnie zapisały się w bazie.
Dane z DevBootstrap pomyślnie zapisały się w bazie.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Wymagane pola są oznaczone *