JavaRush /Kurslar /All lectures for UZ purposes /Asosiy xususiyatlar, 2-qism

Asosiy xususiyatlar, 2-qism

All lectures for UZ purposes
Daraja, Dars
Mavjud

Spring Framework'ning odatiy hodisalari, masalan ContextRefreshedEventga qo'shimcha ravishda, SpringApplication ayrim qo'shimcha dastur hodisalarini yuboradi.

Ayrim hodisalar ApplicationContext yaratilishidan oldin ishga tushiriladi, shuning uchun bu hodisalarning tinglovchilarini @Bean annotatsiyasi sifatida ro'yxatdan o'tkazib bo'lmaydi. Siz ularni SpringApplication.addListeners(…​) yoki SpringApplicationBuilder.listeners(…​) metodi orqali ro'yxatdan o'tkazishingiz mumkin.

Agar tinglovchilar dasturni yaratish usuliga bog'liq holda avtomatik ravishda ro'yxatga olinishi kerak bo'lsa, loyihaga META-INF/spring.factories faylini qo'shishingiz va keyinchalik tinglovchi(lar)ga org.springframework.context.ApplicationListener kaliti orqali murojaat qilishingiz mumkin, masalan quyidagi misolda ko'rsatilgandek:

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

Dastur hodisalari ilova bajarilishi bilan quyidagi tartibda yuboriladi:

  1. ApplicationStartingEvent hodisasi bajarilishining boshida, lekin tinglovchilar va ishga tushirgichlarni ro'yxatga olishdan tashqari, boshlanishidan oldin yuboriladi.

  2. ApplicationEnvironmentPreparedEvent hodisasi, kontestda ishlatiladigan Environment ma'lum bo'lganda, lekin kontekst yaratilishidan oldin yuboriladi.

  3. ApplicationContextInitializedEvent hodisasi ApplicationContext tayyor qilinib, ApplicationContextInitializers chaqirilganda, lekin bin definitsiyalari yuklanishidan oldin yuboriladi.

  4. ApplicationPreparedEvent hodisasi yangilanish boshlanishidan oldin, lekin bin definitsiyalari yuklangandan keyin yuboriladi.

  5. ApplicationStartedEvent hodisasi kontekst yangilangandan keyin, lekin barcha dastur bajarilish vositalari va komanda qatori chaqirilguncha yuboriladi.

  6. Bu orqaga zudlikda LivenessState.CORRECT bilan AvailabilityChangeEvent hodisasi yuboriladi, bu dastur ishga tushganligini ko'rsatadi.

  7. ApplicationReadyEvent hodisasi har qanday dastur bajarilish vositalari va komanda qatori chaqirilgandan keyin yuboriladi.

  8. Bu orqaga zudlikda ReadinessState.ACCEPTING_TRAFFIC bilan AvailabilityChangeEvent hodisasi yuboriladi, bu dastur so'rovlarni qayta ishlashga tayyorligini bildiradi.

  9. Agar ishga tushirishda istisno yuzaga kelsa, ApplicationFailedEvent hodisasi yuboriladi.

Yuqorida keltirilgan ro'yxat faqat SpringApplicationEvent hodisalarini o'z ichiga olgan bo'lib, ular SpringApplicationga bog'liq. Ularga qo'shimcha ravishda, quyidagi hodisalar ham ApplicationPreparedEventdan keyin va ApplicationStartedEventdan oldin e'lon qilinadi:

  • WebServerInitializedEvent hodisasi WebServer tayyor bo'lganda yuboriladi. ServletWebServerInitializedEvent va ReactiveWebServerInitializedEvent mos ravishda servlet va reaktiv server variantlari hisoblanadi.

  • ContextRefreshedEvent hodisasi, agar ApplicationContext yangilansa, yuboriladi.

Dastur hodisalarini ishlatishga ehtiyoj yo'q, lekin ularning mavjudligini bilish foydali bo'lishi mumkin. Spring Boot darajasida hodisalar turli vazifalarni bajarish uchun ishlatiladi.
Hodisalar tinglovchilari potentsial uzoq davom etuvchi vazifalarni bajarishi kerak emas, chunki ular odatda bir ipda ishlaydi. Buning o'rniga dastur bajarilish vositalari va komanda qatoridan foydalanishni ko'rib chiqing.

Dastur hodisalari Spring Framework hodisalarini e'lon qilish mexanizmi orqali yuboriladi. Ushbu mexanizmning bir qismi shuni ta'minlaydiki, farzand kontekstida tinglovchilarga e'lon qilingan hodisa, har qanday ota-ona kontekstlaridagi tinglovchilarga ham e'lon qilinadi. Shunday qilib, agar dasturingiz SpringApplication nusxalarining iyerarxiyasidan foydalansa, tinglovchi bir xil dastur hodisasi turining bir nechta nusxalarini olish mumkin.

Tinglovchi o'z konteksti uchun hodisani farzand konteksti uchun hodisadan farqlay olishi uchun o'z dastur kontekstini joylashini talab qilishi va qo'shilgan kontekstni hodisa konteksti bilan solishtirishi kerak. Kontekst ApplicationContextAwareni amalga oshirish orqali yoki agar tinglovchi bin bo'lsa, @Autowired annotatsiyasi orqali joylashtirilishi mumkin.

Veb-muhit

SpringApplication kerakli ApplicationContext turini yaratishga harakat qiladi. WebApplicationTypeni aniqlash uchun quyidagi algoritm ishlatiladi:

  • Agar Spring MVC mavjud bo'lsa, AnnotationConfigServletWebServerApplicationContext ishlatiladi

  • Agar Spring MVC mavjud bo'lmasa va Spring WebFlux mavjud bo'lsa, AnnotationConfigReactiveWebServerApplicationContext ishlatiladi

  • Aks holda AnnotationConfigApplicationContext ishlatiladi

Bu shuni anglatadiki, agar siz Spring MVC va yangi WebClientni Spring WebFlux bilan bir dasturda ishlatsangiz, Standart bo'lib Spring MVC ishlatiladi. Buni osonlik bilan setWebApplicationType(WebApplicationType)ni chaqirish orqali o'zgartirishingiz mumkin.

Shuningdek, ApplicationContextning ishlatiladigan turini to'liq boshqarish mumkin, setApplicationContextClass(…​)ni chaqirish orqali.

Odatda SpringApplicationni JUnit testida ishlatishda setWebApplicationType(WebApplicationType.NONE) ni chaqirish tavsiya etiladi.

Dastur argumentlariga kirish

Agar SpringApplication.run(…​) ga uzatilgan dastur argumentlariga kirish kerak bo'lsa, org.springframework.boot.ApplicationArguments binini kiritishingiz mumkin. ApplicationArguments interfeysi String[] xom argumentlari va option va non-option argumentlariga kirish imkonini beradi, quyidagi misolda ko'rsatilgandek:

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); } // agar "--debug logfile.txt" parametri bilan ishga tushirilsa, ["logfile.txt"] chiqishi ko'rsatiladi. } } 
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) } // agar "--debug logfile.txt" parametri bilan ishga tushirilsa, ["logfile.txt"] chiqishi ko'rsatiladi. } } 
Spring Boot shuningdek, Spring'dan Environmentda CommandLinePropertySourceni ro'yxatga oladi. Bu, boshqa narsalar qatorida, @Value annotatsiyasi yordamida alohida dastur argumentlarini joylashtirish imkonini beradi.

ApplicationRunner yoki CommandLineRunner dan foydalanish

Agar SpringApplication ishga tushirildikdan keyin ma'lum bir kodni bajarish kerak bo'lsa, ApplicationRunner yoki CommandLineRunner interfeyslarini amalga oshirishingiz mumkin. Har ikkala interfeys bir xil ishlaydi va run metodini ta'minlaydi, bu SpringApplication.run(…​) tugallanishidan oldin chaqiriladi.

Ushbu shartnoma dastur ishga tushgandan keyin, lekin u trafikni qabul qilishni boshlamasdan oldin bajarilishi kerak bo'lgan vazifalar uchun mos keladi.

CommandLineRunner interfeysi dastur argumentlariga qatorlar massivi shaklida kirishni ta'minlaydi, ApplicationRunner esa ilgari ko'rib chiqilgan ApplicationArguments interfeysidan foydalanadi. Quyidagi misolda CommandLineRunner run metodi ko'rsatilgan:

Java
import org.springframework.boot.CommandLineRunner; import org.springframework.stereotype.Component; @Component public class MyCommandLineRunner implements CommandLineRunner { @Override public void run(String... args) { // biror ish qilamiz... } } 
Kotlin
import org.springframework.boot.CommandLineRunner import org.springframework.stereotype.Component @Component class MyCommandLineRunner : CommandLineRunner { override fun run(vararg args: String) { // biror ish qilamiz... } } 

Agar ma'lum bir tartibda chaqirilishi kerak bo'lgan bir nechta CommandLineRunner yoki ApplicationRunner bini aniqlangan bo'lsa, siz qo'shimcha ravishda org.springframework.core.Ordered interfeysini amalga oshirishingiz yoki org.springframework.core.annotation.Order annotatsiyasini ishlatishingiz mumkin.

Dasturdan chiqish

Har bir SpringApplication JVMda yakuniy ishni yakunlash uchun ApplicationContextni bosqichma-bosqich yopilishini ta'minlash uchun yakuniy qo'shimchani ro'yxatga oladi. Siz Spring hayot siklining barcha standart qayta qo'ng'iroqlaridan foydalanishingiz mumkin (masalan, DisposableBean interfeysi yoki @PreDestroy annotatsiyasi).

Bundan tashqari, binlar, SpringApplication.exit() chaqirilganda ma'lum bir chiqish kodini qaytarishlari kerak bo'lsa, org.springframework.boot.ExitCodeGenerator interfeysini amalga oshirishi mumkin. Ushbu chiqish kodini System.exit() ga o'tkazishingiz va uni holat kodi sifatida qaytarishingiz mumkin, quyidagi misolda ko'rsatilganidek:

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))) } 

Bundan tashqari, ExitCodeGenerator interfeysi istisnolar tomonidan amalga oshirilishi mumkin. Bunday istisno yuzaga kelsa, Spring Boot amalga oshirilgan getExitCode() metodi tomonidan o'tkazilgan chiqish kodini qaytaradi.

Agar bir nechta ExitCodeGenerator mavjud bo'lsa, unda birinchi bo'lib yaratilgan nodir chiqish kodi ishlatiladi. Generatorlarni chaqirish tartibini boshqarish uchun qo'shimcha ravishda org.springframework.core.Ordered interfeysini amalga oshiring yoki org.springframework.core.annotation.Order annotatsiyasidan foydalaning.

Boshqaruv funksiyalari

Dastur uchun boshqaruv bilan bog'liq funksiyalarni spring.application.admin.enabled xususiyatini o'rnatish orqali yoqishingiz mumkin. Bu MBeanServer platformasiga SpringApplicationAdminMXBean ni ochadi. Bu funksiyani Spring Boot dasturini masofadan boshqarish uchun ishlatishingiz mumkin. Ushbu funksiya, shuningdek, har qanday xizmatga o'rama amalga oshirish uchun foydali bo'lishi mumkin.

Agar dasturning qaysi HTTP-port orqali ishlayotganligini bilmoqchi bo'lsangiz, local.server.port kalitli xususiyatni oling.

Dastur ishga tushirilishini kuzatish

Dastur ishga tushirilishi vaqtida SpringApplication va ApplicationContext bir qancha dastur hayot tsikli, bin hayot tsikli yoki hatto dastur hodisalarini qayta ishlash bilan bog'liq vazifalarni bajaradi. Spring Framework's ApplicationStartup yordamida StartupStep obyektlari orqali dastur ishga tushirilishini ketma-ketlikda kuzatish imkonini beradi. Ushbu ma'lumotlar profiling uchun yoki shunchaki dastur ishga tushirilishini yaxshiroq tushunish uchun yig'ilishi mumkin.

SpringApplication nusxasini o'rnatish paytida ApplicationStartupning aniq bir amalga oshirilishini tanlash imkoniyati mavjud. Masalan, BufferingApplicationStartupni ishlatish uchun quyidagicha yozishingiz mumkin:

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) } } 

Birinchi variant, FlightRecorderApplicationStartup, Spring Framework tomonidan taqdim etilgan. U Spring bilan bog'liq ishga tushirish hodisalarini Java Flight Recorder sessiyasiga qo'shadi va dasturlarni profiling uchun mo'ljallangan va Spring-kontekst hayotiy tsiklini JVM hodisalariga (masalan, ajratish operatsiyalari, ma'lumotlarni tozalash operatsiyalari, klasslarni yuklash ...) mos keladi.

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

Spring Boot BufferingApplicationStartupning varianti bilan birga keladi; bu amalga oshirish ishga tushirish bosqichlarini buferlash va ularni tashqi metrik tizimga tushirish uchun mo'ljallangan. Dasturlar istalgan komponentda BufferingApplicationStartup turidagi binni so'rashi mumkin.

Spring Bootni shuningdek, startup endpointni ochib, ushbu ma'lumotni JSON hujjati shaklida taqdim etishini sozlashingiz mumkin.

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