Siirry pääsisältöön

Elämänkierron kuuntelijat 25.02

Avaa ChatGPT:ssä

AppLifecycleListener -rajapinta mahdollistaa ulkoisen koodin havaita ja reagoida sovelluksen elämänkierron tapahtumiin. Toteuttamalla tämän rajapinnan voit suorittaa koodia tietyissä vaiheissa sovelluksen käynnistyksen ja sulkemisen aikana ilman, että sinun tarvitsee muuttaa itse App-luokkaa.

Elämänkierron kuuntelijat havaitaan ja ladataan automaattisesti ajon aikana palveluntarjoajien konfigurointitiedostojen kautta. Jokaiselle sovellusinstanssille annetaan oma joukko kuuntelija-instansseja, mikä ylläpitää eristyneisyyttä eri sovellusten välillä, jotka toimivat samassa ympäristössä.

Milloin käyttää elämänkierron kuuntelijoita

Käytä elämänkierron kuuntelijoita, kun sinun tarvitsee:

  • Alustaa resursseja tai palveluja ennen sovelluksen suorittamista
  • Siivota resursseja, kun sovellus päättyy
  • Lisätä poikkileikkaavia huolenaiheita ilman, että muutat App-luokkaa
  • Rakentaa lisäosarakenteita

AppLifecycleListener -rajapinta

AppLifecycleListener.java
public interface AppLifecycleListener {
default void onWillCreate(Environment env) {} // Nyt 25.03
default void onDidCreate(App app) {} // Nyt 25.03
default void onWillRun(App app) {}
default void onDidRun(App app) {}
default void onWillTerminate(App app) {}
default void onDidTerminate(App app) {}
}
Sovellusten eristyneisyys

Jokaiselle sovellusinstanssille annetaan oma joukko kuuntelija-instansseja:

  • Kuuntelijat ovat eristyksissä eri sovellusten välillä
  • Kuuntelijoiden staattisia kenttiä ei jaeta sovellusten välillä
  • Kuuntelija-instanssit luodaan, kun sovellus alkaa, ja ne tuhotaan, kun se päättyy

Jos sinun tarvitsee jakaa tietoja sovellusten välillä, käytä ulkoisia tallennusmekanismeja, kuten tietokantoja tai jaettuja palveluja.

Elämänkierron tapahtumat

TapahtumaMilloin kutsutaanYleisimmät käyttötarkoitukset
onWillCreate 25.03Ympäristön alustamisen jälkeen, ennen sovelluksen luomistaMuokata asetuksia, yhdistää ulkoisia konfiguraatioita
onDidCreate 25.03Sovelluksen luomisen jälkeen, ennen alustamistaVarhaiset sovelluskohtaiset asetukset, rekisteröi palveluja
onWillRunEnnen app.run() -suoritustaAlustaa resursseja, konfiguroi palveluja
onDidRunKun app.run() onnistuneesti päättyyAloittaa taustatehtäviä, lokittaa onnistunut käynnistys
onWillTerminateEnnen sovelluksen sulkemistaTallettaa tilan, valmistautua sulkemiseen
onDidTerminateSovelluksen sulkemisen jälkeenSiivoa resursseja, lopullinen lokitus

Elämänkierron kuuntelijan luominen

Perusimplementaatio

StartupListener.java
import com.webforj.App;
import com.webforj.AppLifecycleListener;
import com.webforj.Environment;
import com.typesafe.config.Config;
import com.typesafe.config.ConfigFactory;

public class StartupListener implements AppLifecycleListener {

@Override
public void onWillCreate(Environment env) {
// Muokkaa asetuksia ennen sovelluksen luomista
Config additionalConfig = ConfigFactory.parseString(
"myapp.feature.enabled = true"
);
env.setConfig(additionalConfig);
}

@Override
public void onDidCreate(App app) {
System.out.println("Sovellus luotu: " + app.getId());
}

@Override
public void onWillRun(App app) {
System.out.println("Sovellus käynnistyy: " + app.getId());
}

@Override
public void onDidRun(App app) {
System.out.println("Sovellus käynnistyi: " + app.getId());
}
}

Kuuntelijan rekisteröiminen

Luo palveluntarjoajan konfigurointitiedosto:

Tiedosto: src/main/resources/META-INF/services/com.webforj.AppLifecycleListener

com.example.listeners.StartupListener
AutoService -käyttö

On helppo unohtaa päivittää palvelukuvastot. Käytä Googlen AutoService -työkalua palvelutiedoston automaattiseen luomiseen:

StartupListener.java
import com.google.auto.service.AutoService;

@AutoService(AppLifecycleListener.class)
public class StartupListener implements AppLifecycleListener {
// Implementaatio
}

Suoritusjärjestyksen hallinta

Kun useita kuuntelijoita on rekisteröity, voit hallita niiden suoritusjärjestystä käyttäen @AppListenerPriority -annotaatiota. Tämä on erityisen tärkeää, kun kuuntelijoilla on riippuvuuksia toisistaan tai kun tiettyjen alustusten on tapahduttava ennen muita.

Prioriteettiarvot toimivat nousevassa järjestyksessä - alemmat numerot suoritetaan ensin. Oletusprioriteetti on 10, joten ilmaisutaidot ilman erityistä prioriteettiannotaatiota suoritetaan niiden jälkeen, joilla on alemmat prioriteettiarvot.

SecurityListener.java
@AutoService(AppLifecycleListener.class)
@AppListenerPriority(1) // Suoritetaan ensin - kriittinen tietoturvapuuhastelu
public class SecurityListener implements AppLifecycleListener {
@Override
public void onWillRun(App app) {
initializeSecurity();
}
}

@AutoService(AppLifecycleListener.class)
@AppListenerPriority(10) // Oletusprioriteetti - yleinen lokitus
public class LoggingListener implements AppLifecycleListener {
@Override
public void onWillRun(App app) {
initializeLogging();
}
}

Suoritusprosessi sovelluksen koukuilla

Useiden kuuntelijoiden suoritusjärjestyksen hallinnan ohella on tärkeää ymmärtää, miten kuuntelijat vuorovaikuttavat App-luokan omien elämänkierron koukkujen kanssa. Jokaisessa elämänkierron tapahtumassa kehys seuraa erityistä suoritusjärjestystä, joka määrittää, milloin kuuntelijasi suoritetaan suhteessa sovelluksen sisäisiin koukkuihin.

Alla oleva kaavio havainnollistaa tätä suoritusprosessia, näyttäen tarkan ajankohdan, jolloin AppLifecycleListener -menetelmiä kutsutaan suhteessa vastaaviin App-koukkuihin:

AppLifecycleListener kuuntelijat VS App koukut

Virheiden käsittely

Kuuntelijoiden heittämät poikkeukset kirjataan, mutta ne eivät estä muiden kuuntelijoiden suorittamista tai sovelluksen toimintaa. Käsittele aina poikkeuksia kuuntelijoissasi:

Virheenkäsittelyesimerkki
@Override
public void onWillRun(App app) {
try {
riskyInitialization();
} catch (Exception e) {
logger.error("Alustus epäonnistui", e);
}
}