JavaRush /Kurslar /All lectures for TK purposes /Esasy aýratynlyklar, 2-nji bölüm

Esasy aýratynlyklar, 2-nji bölüm

All lectures for TK purposes
Dereje , Sapak
Elýeterli

Adaty Spring Framework wakalaryna goşmaça, SpringApplication goşmaça käbir programmanyň wakalaryny iberýär.

Käbir wakalar ApplicationContext döredilmezinden öň başlaýar, şonuň üçin bu wakalaryň diňleýjisini @Bean annotasiýasy hökmünde belläp bilmez. SpringApplication.addListeners(…​) ýa-da SpringApplicationBuilder.listeners(…​) usuly bilen olary belläp bilersiňiz.

Eger programmanyň döredilmegine garaşman, ähli diňleýjileri awtomatiki belläp goýmak isleseňiz, proýekte META-INF/spring.factories faýlyny goşup, diňleýjilere org.springframework.context.ApplicationListener açary bilen salgylanmak bolar, aşakdaky mysalyň görkezilişi ýaly:

org.springframework.context.ApplicationListener=com.example.project.MyListener

Programmanyň ýerine ýetirilmegi bilen birlikde wakalar şu tertipde iberilýär:

  1. Waka ApplicationStartingEvent ýerine ýetirilişiň başynda, emma diňleýjileri we inisializatorlary belläp goýmakdan başga işlerden öň iberilýär.

  2. Waka ApplicationEnvironmentPreparedEvent kontekste ulanyljak Environment belli bolanda, emma kontekstiniň döredilmeginden öň iberilýär.

  3. Waka ApplicationContextInitializedEvent ApplicationContext taýýar we ApplicationContextInitializers çagyrylanda, emma bean belirleýjileri ýüklenmezinden öň iberilýär.

  4. Waka ApplicationPreparedEvent täzeleme başlamazdan öň, emma bean belirleýjileri ýüklenenden soň iberilýär.

  5. Waka ApplicationStartedEvent kontekst täzelenenden soň, emma programmanyň ýerine ýetirilmeginiň we komanda setiriniň ähli araçalary çagyrylmadan öň iberilýär.

  6. Şeýle hem, LivenessState.CORRECT bilen AvailabilityChangeEvent wakasy programmanyň işläp ýörendigini görkezmek üçin omöürlik bilen iberilýär.

  7. Waka ApplicationReadyEvent komanda setiri we programmalaryň ýerine ýetiriliş araçalary çagyrylandan soň iberilýär.

  8. Şeýle hem, ReadinessState.ACCEPTING_TRAFFIC bilen AvailabilityChangeEvent wakasy, programmanyň soraglary kabul etmäge taýyndygyny görkezmek üçin iberilýär.

  9. Waka ApplicationFailedEvent başlangyçda aýratynlykda bir zat nji bolanda iberilýär.

Ýokardaky sanaw diňe SpringApplicationEvent wakalaryny öz içine alýar, olar SpringApplication bilen baglanyşykly. Olar çagyrşyk wagtynda ApplicationPreparedEvent we ApplicationStartedEvent arasynda hem aşakdaky wakalar çap edilýär:

  • Waka WebServerInitializedEvent WebServer taýýar bolandan soň iberilýär. ServletWebServerInitializedEvent we ReactiveWebServerInitializedEvent serwer we reaktiw serwer wariantydyr.

  • Waka ContextRefreshedEvent ApplicationContext täzelenende iberilýär.

Dürli wakalaryň mümkinçilikleri ýok, emma olaryň barlygy köplenç peýdaly bolup biler. Spring Boot programmasynyň içinde wakalary dürli wezipeleri ýerine ýetirmek üçin ulanýar.
Waka diňleýjileri dürli giňişleýän wezipeleri ýerine ýetirip bilmeýär, sebäbi olar adatça bir iş ýerinde ýerine ýetirilýär. Programma we komanda setirine ýerine ýetiriliş araçalaryna göz aýlaň.

Wakalar Spring Framework-iň wakalaryny çap etmek mehanizmi arkaly iberilýär. Bu mehanizmiň bir bölegi, çaga kontekstinde diňleýjilere çap edilen wakanyň, islendik ata-baba kontekstinde hem diňleýjilere çap edilýändigini üpjün edýär. Şeýlelikde, eger siziň programmäňiz SpringApplication nusgalarynyň hierarhiýasyny ulanýan bolsa, diňleýji belli bir wakanyň birnäçe nusgasyny alar.

Diňleýji öz konteksti üçin wakany çaga konteksti üçin wakadan tapawutlandyrmak üçin, ol öz programmasynyň kontekstini girizilmegi talap etmeli we soňra girizilen konteksti wakanyň konteksti bilen deňeşdirmeli. Kontekst ApplicationContextAware bilen ýa-da diňleýji bean bolan bolsa, @Autowired annotasiýasy bilen girizilip bilner.

Web Gurşaw

SpringApplication islenýän görnüşde ApplicationContext döretmäge synanyşýar. WebApplicationType kesgitlemek üçin aşakdaky algoritm ulanylýar:

  • Spring MVC bar bolsa, AnnotationConfigServletWebServerApplicationContext ulanylýar.

  • Spring MVC ýok bolsa we Spring WebFlux bar bolsa, AnnotationConfigReactiveWebServerApplicationContext ulanylýar.

  • Başga ýagdaýda AnnotationConfigApplicationContext ulanylýar.

Bu Spring MVC we täze WebClient-i bir programmada ulansaňyz, Spring MVC yza öwrüler diýmekdir. Muňa ýeňillik bilen setWebApplicationType(WebApplicationType) çagyryp, üýtgetme edip bilersiňiz.

Çäklendirilen ýagdaýda ApplicationContext-iň ulanylýan görnüşine doly gözegçilik edip bilersiňiz, setApplicationContextClass(…​) ulanyp.

Herrä JUnit testinde SpringApplication-ni ulanyp, setWebApplicationType(WebApplicationType.NONE) çagyrmak islegli bolup bilner.

Programma Argumentlerine Giriziň

Programmanyň argumentlerine girmegiň zerurlygy bar bolsa, SpringApplication.run(…​) geçilen, org.springframework.boot.ApplicationArguments bean girizip bilersiňiz. ApplicationArguments interfeýsi String[] ham argumentlerine we option hem-de non-option analiz edilen argumentlerine girmegi üpjün edýär, aşakda görkezilişi ýaly:

Java
import java.util.List; import org.springframework.boot.ApplicationArguments; import org.springframework.stereotype.Component; @Component public class MyBean { public MyBean(ApplicationArguments args) { boolean debug = args.containsOption("debug"); List<String> files = args.getNonOptionArgs(); if (debug) { System.out.println(files); } // eger "--debug logfile.txt" parameteri bilen başlansa, ["logfile.txt"] çykýar. } } 
Kotlin
import org.springframework.boot.ApplicationArguments import org.springframework.stereotype.Component @Component class MyBean(args: ApplicationArguments) { init { val debug = args.containsOption("debug") val files = args.nonOptionArgs if (debug) { println(files) } // eger "--debug logfile.txt" parameteri bilen başlansa, ["logfile.txt"] çykýar. } } 
Spring Boot, Spring içine CommandLinePropertySource-y hem belläp goýýar. Bu aýratynlykda programma argümentlerini @Value annotasiýasy bilen girizmäge mümkinçilik berýär.

ApplicationRunner ýa-da CommandLineRunner ulanmak

Eger SpringApplication-ni işledenden soň, belli bir kod ýerine ýetirmek isleseňiz, ApplicationRunner ýa-da CommandLineRunner interfeýslerini amala aşyryp bilersiňiz. Iki interfeýs hem meňzeş işledilýär we SpringApplication.run(…​) gutulmanka bir gezek çaýrylan run usuly üpjün edýär.

Bu şertnama, programmanyň başlamagyndan soň, emma traffige kabul edilmezinden öň ýerine ýetirilýän wezipeler üçin amatlydyr.

CommandLineRunner interfeýsi programa argumentlerine tekst setirleriniň şekilinde girmäge mümkinçilik berýär, şol bir wagtda ApplicationRunner ozaly ApplicationArguments interfeýsi ulanylýar. Aşakda run usuly bilen CommandLineRunner görkezen:

Java
import org.springframework.boot.CommandLineRunner; import org.springframework.stereotype.Component; @Component public class MyCommandLineRunner implements CommandLineRunner { @Override public void run(String... args) { // bir zatlar edýäris... } } 
Kotlin
import org.springframework.boot.CommandLineRunner import org.springframework.stereotype.Component @Component class MyCommandLineRunner : CommandLineRunner { override fun run(vararg args: String) { // bir zatlar edýäris... } } 

Eger birnäçe CommandLineRunner ýa-da ApplicationRunner bean ýazylan bolsa we olaryň bellenenden öň bellenilmegi zerur bolsa, org.springframework.core.Ordered interfeýsini hem-de org.springframework.core.annotation.Order annotasiýasyny ulanyp bilersiňiz.

Programmadan Çykmak

Her SpringApplication registrasiýa çykaryş başlygy JVM-de, programmanyň kontekstiniň tertipli ýapylmagy üçin üpjün etmek. Spring-iň ähli ömür dolanşygy çagyryşlary (meselem, DisposableBean interfeýsi ýa-da @PreDestroy annotasiýasy) ulanyp bilersiňiz.

Mundan başga-da, bean-lar org.springframework.boot.ExitCodeGenerator interfeýsini amala aşyryp biler, eger olara belli bir çykaryş kodyny return etmek zerur bolsa, SpringApplication.exit() çagyrylanda. Bu çykaryş kodyny System.exit() geçip, ýagdaý kodyny return etmek üçin ulanyp bilersiňiz, aşakdaky mysalda görkezilen gibi:

Java
import org.springframework.boot.ExitCodeGenerator; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; @SpringBootApplication public class MyApplication { @Bean public ExitCodeGenerator exitCodeGenerator() { return () -> 42; } public static void main(String[] args) { System.exit(SpringApplication.exit(SpringApplication.run(MyApplication.class, args))); } } 
Kotlin
import org.springframework.boot.ExitCodeGenerator import org.springframework.boot.SpringApplication import org.springframework.boot.autoconfigure.SpringBootApplication import org.springframework.boot.runApplication import org.springframework.context.annotation.Bean import kotlin.system.exitProcess @SpringBootApplication class MyApplication { @Bean fun exitCodeGenerator() = ExitCodeGenerator { 42 } } fun main(args: Array<String>) { exitProcess(SpringApplication.exit( runApplication<MyApplication>(*args))) } 

Mundan başga-da, ExitCodeGenerator interfeýsi aýratynlyklara hem göçürilip bilner. Şeýle aýratynlyk ýüze çykanda, Spring Boot getExitCode() usuly bilen geçirilen çykgynçlyk koduny return edýär.

Eger birnäçe ExitCodeGenerator bar bolsa, ilkinji boljak çykgynçlyk kody ulanylýar. Generatorlaryň çagyryş tertibine gözegçilik etmek üçin org.springframework.core.Ordered interfeýsini hem-de org.springframework.core.annotation.Order annotasiýasyny ulanyň.

Işleriň Dolandyryşy

Programma bilen baglanyşykly dolandyryşlaryň funksiýalaryny işjeňleşdirmek üçin spring.application.admin.enabled ýagdaýyny bellemek mümkin. Bu aýratynlyk SpringApplicationAdminMXBean MBeanServer platformasy üçin açar. Spring Boot programmasyny uzakdan dolandyrmak üçin bu aýratynlykdan peýdalanyp bilersiňiz. Bu aýratynlyk ähli hyzmatlardyr obýektler üçin peýdaly bolup biler.

Eger programmanyň haýsy HTTP portlarynda işläp durandygyny anyklamak isleseňiz, local.server.port açaryna eýe boluň.

Programmanyň Başlanyolyny Yzarlamak

Programmanyň ýola goýulmagy wagtynda SpringApplication we ApplicationContext programmanyň ömri dolanşygyna, bean ömri dolanşygyna we hatda programmanyň wakalaryna baglanyşykly köp sanly işjeňlikleri ýerine ýetirýär. ApplicationStartup Spring Framework-iň programmagy ýola goşmak üçin StartupStep objekti arkaly yzarlamagyny üpjün edýär. Bu maglumatlary profilleşdirme we ýa-da diňe programmanyň başlama prosesine has gowy düşünmek üçin ýygnap bolýar.

Sprinteriň beýan edilýän nusgasyny sazlamagyňyz bilen ApplicationStartup amala aşyryşyny saýlamak mümkin. Mysal üçin, BufferingApplicationStartup-y ulanmak üçin şu aşakdaky ýaly ýazmak mümkin:

Java
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.context.metrics.buffering.BufferingApplicationStartup; @SpringBootApplication public class MyApplication { public static void main(String[] args) { SpringApplication application = new SpringApplication(MyApplication.class); application.setApplicationStartup(new BufferingApplicationStartup(2048)); application.run(args); } } 
Kotlin
import org.springframework.boot.autoconfigure.SpringBootApplication import org.springframework.boot.context.metrics.buffering.BufferingApplicationStartup import org.springframework.boot.runApplication @SpringBootApplication class MyApplication fun main(args: Array<String>) { runApplication<MyApplication>(*args) { applicationStartup = BufferingApplicationStartup(2048) } } 

Ilkinji elýeterli amala aşyryş, FlightRecorderApplicationStartup, Spring Framework tarapyndan üpjün edilýär. Ol açyş maglumatlaryny Java Flight Recorder sessiýasyna goşýar we ýakynlaşdyrma programmalary üçin hem Spring-kontekstiň ömür dolanşygynyň JVM bilen baglanyşykly wakalary bilen (ýaly razdelke, памяти arassalama amallary, класс gaplamasy) çap etmek üçin niýetlenendir. Konfigurasiýadan soň, Flight Recorder bilen işläp:

$ java -XX:StartFlightRecording:filename=recording.jfr,duration=10s -jar demo.jar

Spring Boot öz görnüşi bolan BufferingApplicationStartup bilen üpjün edýär; bu amala aşyryş başlama ädimlerini buferi saklamak we olary daşarky metrik ulgama atmak üçin niýetlenendir. Programmalar islenýän komponentde BufferingApplicationStartup görnüşli bean talap edip biler.

Spring Boot hem startup nokadyny açmak üçin konfigurasiýa edilip biler, bu ýagdaýda bu maglumatlary JSON dokmentiniň görnüşinde geçmek mümkin.

Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION