Útmutató a logika futtatásához az indításkor tavasszal

1. Bemutatkozás

Ebben a cikkben arra fogunk koncentrálni, hogyan futtassa a logikát a Spring alkalmazás indításakor.

2. A Logic futtatása indításkor

A logika futtatása a Spring alkalmazás indításakor / után gyakran előfordul, de több problémát okoz.

Annak érdekében, hogy kihasználhassuk az inverz vezérlés előnyeit, természetesen le kell mondanunk az alkalmazás konténerbe történő áramlásának részleges ellenőrzéséről - ezért kell különös figyelmet fordítani a példányosításra, az indításkor beállított logikára stb.

Nem lehet egyszerűen belefoglalni logikánkat a babkonstruktorokba vagy hívni a metódusokat bármely objektum példányosítása után; egyszerűen nem kontrolláljuk azokat a folyamatokat.

Nézzük meg a valós példát:

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

Itt próbálunk hozzáférni egy autowired mező a konstruktorban. A konstruktor meghívásakor a tavaszi bab még nincs teljesen inicializálva. Ez azért problematikus, mert a még nem inicializált mezők meghívása természetesen eredményez NullPointerExceptions.

A tavasz néhány módot kínál a helyzet kezelésére.

2.1. A @PostConstruct Megjegyzés

Javax-ok @PostConstruct annotáció használható a futtatandó módszer annotálásához egyszer közvetlenül a bab inicializálása után. Ne feledje, hogy az annotált módszert Spring akkor is végrehajtja, ha nincs mit injektálni.

Itt van @PostConstruct működés közben:

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

A fenti példában láthatja, hogy a Környezet példányt biztonságosan beadták, majd behívták a @PostConstruct annotált módszer a dobás nélkül NullPointerException.

2.2. A InitializingBean Felület

A InitializingBean megközelítés elég hasonlóan működik, mint az előző. A módszer annotálása helyett a InitializingBean interfész és a afterPropertiesSet () módszer.

Itt láthatja az előző példát, amely a InitializingBean felület:

@Component public class InitializingBeanExampleBean megvalósítja az InitializingBean {private static final Logger LOG = Logger.getLogger (InitializingBeanExampleBean.class); @Autowired magánkörnyezet; @Orride public void afterPropertiesSet () dobja a Kivételt {LOG.info (Arrays.asList (environment.getDefaultProfiles ())); }}

2.3. An ApplicationListener

Ez a megközelítés használható futó logika a tavaszi kontextus inicializálása után, ezért nem egy adott babra koncentrálunk, hanem arra várunk, hogy mindegyik inicializálódjon.

Ennek eléréséhez létre kell hoznia egy babot, amely megvalósítja a ApplicationListener felület:

@Component public class StartupApplicationListenerExample implementálja az ApplicationListener {private static final Logger LOG = Logger.getLogger (StartupApplicationListenerExample.class); public static int counter; @Orride public void onApplicationEvent (ContextRefreshedEvent event) {LOG.info ("Növekményszámláló"); számláló ++; }} 

Ugyanezeket az eredményeket lehet elérni az újonnan bevezetett @EventListener kommentár:

@Component public class EventListenerExampleBean {private static final Logger LOG = Logger.getLogger (EventListenerExampleBean.class); public static int counter; @EventListener public void onApplicationEvent (ContextRefreshedEvent esemény) {LOG.info ("Növekményszámláló"); számláló ++; }}

Ebben a példában a ContextRefreshedEvent. Ügyeljen arra, hogy az Ön igényeinek megfelelő eseményt válasszon.

2.4. A @Bab Initmethod Attribútum

A initMethod tulajdonság használható egy módszer végrehajtására a bab inicializálása után.

Így néz ki egy bab:

public class InitMethodExampleBean {private static final Logger LOG = Logger.getLogger (InitMethodExampleBean.class); @Autowired magánkörnyezet; public void init () {LOG.info (Tömbök.asList (környezet.getDefaultProfiles ())); }}

Észreveheti, hogy nincsenek speciális interfészek implementálva, és nem használtak különféle kommentárokat.

Ezután meghatározhatjuk a babot a @Bab kommentár:

@Bean (initMethod = "init") public InitMethodExampleBean initMethodExampleBean () {return new InitMethodExampleBean (); }

A babdefiníció így néz ki egy XML konfigurációban:

2.5. Konstruktor befecskendezése

Ha mezőket injektál a Constructor Injection használatával, egyszerűen beillesztheti logikáját egy konstruktorba:

@Component public class LogicInConstructorExampleBean {private static final Logger LOG = Logger.getLogger (LogicInConstructorExampleBean.class); magán végső Környezetvédelem; @Autowired public LogicInConstructorExampleBean (Környezeti környezet) {this.környezet = környezet; LOG.info (Tömbök.asList (környezet.getDefaultProfiles ())); }}

2.6. Tavaszi csizma CommandLineRunner

A tavaszi csomagtartó biztosítja a CommandLineRunner interfész visszahívással fuss() módszer, amely az alkalmazás indításakor meghívható a tavaszi alkalmazáskörnyezet példányosítása után.

Nézzünk meg egy példát:

@Component public class CommandLineAppStartupRunner végrehajtja a CommandLineRunner {private static final Logger LOG = LoggerFactory.getLogger (CommandLineAppStartupRunner.class); public static int counter; @Orride public void run (String ... args) dobja a Kivételt {LOG.info ("Növekményszámláló"); számláló ++; }}

jegyzet: A dokumentációban említettek szerint többszörös CommandLineRunner A babot ugyanabban az alkalmazáskörnyezetben lehet meghatározni, és a @ Rendelt interfész vagy @Rendelés annotáció.

2.7. Tavaszi csizma ApplicationRunner

Hasonló CommandLineRunner, A tavaszi bakancs egy ApplicationRunner interfész a fuss() az alkalmazás indításakor meghívandó módszer. A nyers helyett azonban Húr a visszahívási metódusnak átadott argumentumok, van egy ApplicationArguments osztály.

A ApplicationArguments Az interfésznek vannak metódusai az argumentumértékek megszerzésére, amelyek opciók és egyszerű argumentumértékek. A - - előtagú argumentum egy opció argumentum.

Nézzünk meg egy példát:

@Component public class AppStartupRunner megvalósítja az ApplicationRunner {private static final Logger LOG = LoggerFactory.getLogger (AppStartupRunner.class); public static int counter; A @Orride public void run (ApplicationArguments args) a (z) {LOG.info ("Az alkalmazás neve opciók nevével indult: {}", args.getOptionNames ()) kivételt dob; LOG.info ("Növekményszámláló"); számláló ++; }}

3. Mechanizmusok kombinálása

A babok teljes ellenőrzése érdekében érdemes a fenti mechanizmusokat egyesíteni.

A végrehajtás sorrendje a következő:

  1. A kivitelező
  2. a @PostConstruct kommentált módszerek
  3. az InitializingBean afterPropertiesSet () módszer
  4. a megadott inicializálási módszer init-módszer XML-ben

Hozzunk létre egy tavaszi babot, amely egyesíti az összes mechanizmust:

@Component @Scope (value = "prototípus") public class AllStrategiesExampleBean megvalósítja az InitializingBean {private static final Logger LOG = Logger.getLogger (AllStrategiesExampleBean.class); public AllStrategiesExampleBean () {LOG.info ("Konstruktor"); } @Orride public void afterPropertiesSet () dobja a Kivételt {LOG.info ("InitializingBean"); } @PostConstruct public void postConstruct () {LOG.info ("PostConstruct"); } public void init () {LOG.info ("init-módszer"); }}

Ha megpróbálja példányosítani ezt a babot, akkor láthatja azokat a naplókat, amelyek megfelelnek a fent megadott sorrendnek:

[main] INFO o.b.startup.AllStrategiesExampleBean - Konstruktor [main] INFO o.b.startup.AllStrategiesExampleBean - PostConstruct [main] INFO o.b.startup.AllStrategiesExampleBean - InitializingBean [main] INFO o.b.startup.A

4. Következtetés

Ebben a cikkben a logika végrehajtásának több módját szemléltettük a Spring alkalmazás indításakor.

Kódminták a GitHub oldalon találhatók.