Ú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ő:
- A kivitelező
- a @PostConstruct kommentált módszerek
- az InitializingBean afterPropertiesSet () módszer
- 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.