Sprievodca spustením logiky pri štarte na jar

1. Úvod

V tomto článku sa zameriame na to, ako na to spustiť logiku pri spustení jarnej aplikácie.

2. Spustenie logiky pri štarte

Spúšťanie logiky počas / po spustení aplikácie Spring je bežný scenár, ktorý však spôsobuje viac problémov.

Aby sme mohli ťažiť z inverznej kontroly, musíme sa prirodzene vzdať čiastočnej kontroly nad tokom aplikácie do kontajnera - preto je potrebné venovať osobitnú pozornosť inštancii, logike nastavenia pri štarte atď.

Nemôžeme jednoducho zahrnúť našu logiku do konštruktorov fazule alebo volacích metód po vytvorení inštancie ľubovoľného objektu; počas týchto procesov jednoducho nemáme kontrolu.

Pozrime sa na príklad z reálneho života:

@Component public class InvalidInitExampleBean {@Autowired private Environment env; public InvalidInitExampleBean () {env.getActiveProfiles (); }}

Tu sa pokúšame získať prístup k autowired pole v konštruktore. Keď sa volá konštruktor, jarná fazuľa ešte nie je úplne inicializovaná. To je problematické, pretože volanie ešte neinicializovaných polí bude mať samozrejme za následok NullPointerExceptions.

Jar nám poskytuje niekoľko spôsobov riešenia tejto situácie.

2.1. The @PostConstruct Anotácia

Javax @PostConstruct anotáciu možno použiť na anotáciu metódy, ktorá by sa mala spustiť jedenkrát bezprostredne po inicializácii fazule. Majte na pamäti, že anotovanú metódu vykoná Spring, aj keď nie je do čoho vložiť.

Tu je @PostConstruct v akcii:

@Component public class PostConstructExampleBean {private static final Logger LOG = Logger.getLogger (PostConstructExampleBean.class); @Autowired private Environment environment; @PostConstruct public void init () {LOG.info (Arrays.asList (environment.getDefaultProfiles ())); }}

Na príklade vyššie môžete vidieť, že Životné prostredie inštancia bola bezpečne injikovaná a následne privolaná @PostConstruct komentovaná metóda bez hádzania a NullPointerException.

2.2. The InitializingBean Rozhranie

The InitializingBean prístup funguje dosť podobne ako predchádzajúci. Namiesto anotácie metódy musíte implementovať InitializingBean rozhranie a afterPropertiesSet () metóda.

Tu vidíte predchádzajúci príklad implementovaný pomocou InitializingBean rozhranie:

@Component public class InitializingBeanExampleBean implementuje InitializingBean {private static final Logger LOG = Logger.getLogger (InitializingBeanExampleBean.class); @Autowired private Environment environment; @Override public void afterPropertiesSet () vyvolá výnimku {LOG.info (Arrays.asList (environment.getDefaultProfiles ())); }}

2.3. An ApplicationListener

Tento prístup je možné použiť na spustenie logiky po inicializácii jarného kontextu, takže sa nezameriavame na žiadnu konkrétnu fazuľu, ale čakáme na ich inicializáciu.

Aby ste to dosiahli, musíte vytvoriť fazuľu, ktorá implementuje ApplicationListener rozhranie:

@ Komponenta verejná trieda StartupApplicationListenerExample implementuje ApplicationListener {private static final Logger LOG = Logger.getLogger (StartupApplicationListenerExample.class); verejné statické int počítadlo; @Override public void onApplicationEvent (udalosť ContextRefreshedEvent) {LOG.info ("Počítadlo prírastku"); pult ++; }} 

Rovnaké výsledky možno dosiahnuť použitím novo zavedeného produktu @EventListener anotácia:

@Component public class EventListenerExampleBean {private static final Logger LOG = Logger.getLogger (EventListenerExampleBean.class); verejné statické int počítadlo; @EventListener public void onApplicationEvent (udalosť ContextRefreshedEvent) {LOG.info ("Počítadlo prírastku"); pult ++; }}

V tomto príklade sme vybrali ContextRefreshedEvent. Určite si vyberte vhodnú udalosť, ktorá vyhovuje vašim potrebám.

2.4. The @Bean Atribút Initmethod

The initMethod možno použiť na vykonanie metódy po inicializácii fazule.

Fazuľa vyzerá takto:

public class InitMethodExampleBean {private static final Logger LOG = Logger.getLogger (InitMethodExampleBean.class); @Autowired private Environment environment; public void init () {LOG.info (Arrays.asList (environment.getDefaultProfiles ())); }}

Môžete si všimnúť, že nie sú implementované žiadne špeciálne rozhrania ani použité špeciálne poznámky.

Potom môžeme fazuľu definovať pomocou @Bean anotácia:

@Bean (initMethod = "init") public InitMethodExampleBean initMethodExampleBean () {vrátiť nový InitMethodExampleBean (); }

Takto vyzerá definícia fazule v konfigurácii XML:

2.5. Constructor Injection

Ak vkladáte polia pomocou aplikácie Constructor Injection, môžete jednoducho zahrnúť svoju logiku do konštruktora:

@Component public class LogicInConstructorExampleBean {private static final Logger LOG = Logger.getLogger (LogicInConstructorExampleBean.class); súkromné ​​konečné životné prostredie; @Autowired public LogicInConstructorExampleBean (prostredie prostredia) {this.environment = prostredie; LOG.info (Arrays.asList (environment.getDefaultProfiles ())); }}

2.6. Jarná topánka CommandLineRunner

Pružinová topánka poskytuje a CommandLineRunner rozhranie so spätným volaním run () metóda, ktorú je možné vyvolať pri štarte aplikácie po vytvorení inštancie kontextu aplikácie Spring.

Pozrime sa na príklad:

@Component public class CommandLineAppStartupRunner implementuje CommandLineRunner {private static final Logger LOG = LoggerFactory.getLogger (CommandLineAppStartupRunner.class); verejné statické int počítadlo; @Override public void run (String ... args) vyvolá Výnimku {LOG.info ("Počítadlo prírastkov"); pult ++; }}

Poznámka: Ako je uvedené v dokumentácii, viacnásobné CommandLineRunner fazuľa sa dá definovať v rovnakom kontexte aplikácie a dá sa objednať pomocou @Objednané rozhranie alebo @Objednať anotácia.

2.7. Jarná topánka ApplicationRunner

Podobný CommandLineRunner, Jarná topánka tiež poskytuje ApplicationRunner rozhranie s a run () metóda, ktorá sa má vyvolať pri štarte aplikácie. Avšak namiesto surového String argumenty odovzdané metóde spätného volania, máme inštanciu súboru Argumenty aplikácie trieda.

The Argumenty aplikácie rozhranie má metódy na získanie hodnôt argumentov, ktorými sú možnosti a hodnoty obyčajných argumentov. Argument, ktorý má predponu - -, je argumentom voľby.

Pozrime sa na príklad:

@Component public class AppStartupRunner implementuje ApplicationRunner {private static final Logger LOG = LoggerFactory.getLogger (AppStartupRunner.class); verejné statické int počítadlo; @Override public void run (ApplicationArguments args) vyvolá výnimku {LOG.info ("Aplikácia bola spustená s názvami možností: {}", args.getOptionNames ()); LOG.info ("Počítadlo prírastku"); pult ++; }}

3. Kombinujúce mechanizmy

Aby ste dosiahli úplnú kontrolu nad svojimi zrnkami, možno budete chcieť kombinovať vyššie uvedené mechanizmy.

Poradie exekúcie je nasledovné:

  1. Konštruktér
  2. the @PostConstruct anotované metódy
  3. InitializingBean afterPropertiesSet () metóda
  4. inicializačná metóda uvedená ako metóda init v XML

Vytvorme jarnú fazuľu, ktorá kombinuje všetky mechanizmy:

@Component @Scope (value = "prototyp") verejná trieda AllStrategiesExampleBean implementuje InitializingBean {private static final Logger LOG = Logger.getLogger (AllStrategiesExampleBean.class); public AllStrategiesExampleBean () {LOG.info ("konštruktér"); } @Override public void afterPropertiesSet () vyvolá výnimku {LOG.info ("InitializingBean"); } @PostConstruct public void postConstruct () {LOG.info ("PostConstruct"); } public void init () {LOG.info ("init-metóda"); }}

Ak sa pokúsite vytvoriť inštanciu tohto zrna, uvidíte protokoly, ktoré zodpovedajú vyššie uvedenému poradiu:

[hlavné] INFO o.b.startup.AllStrategiesExampleBean - Konštruktor [hlavné] INFO o.b.startup.AllStrategiesExampleBean - PostConstruct [hlavné] INFO o.b.startup.AllStrategiesExampleBean - InitializingBean [hlavné] INFO o.b.startup.AllStries.AllStries.AllStries

4. Záver

V tomto článku sme ilustrovali niekoľko spôsobov vykonávania logiky pri štarte aplikácie Spring.

Ukážky kódu nájdete na GitHub.


$config[zx-auto] not found$config[zx-overlay] not found