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:
-
ApplicationStartingEventhodisasi bajarilishining boshida, lekin tinglovchilar va ishga tushirgichlarni ro'yxatga olishdan tashqari, boshlanishidan oldin yuboriladi. -
ApplicationEnvironmentPreparedEventhodisasi, kontestda ishlatiladiganEnvironmentma'lum bo'lganda, lekin kontekst yaratilishidan oldin yuboriladi. -
ApplicationContextInitializedEventhodisasiApplicationContexttayyor qilinib, ApplicationContextInitializers chaqirilganda, lekin bin definitsiyalari yuklanishidan oldin yuboriladi. -
ApplicationPreparedEventhodisasi yangilanish boshlanishidan oldin, lekin bin definitsiyalari yuklangandan keyin yuboriladi. -
ApplicationStartedEventhodisasi kontekst yangilangandan keyin, lekin barcha dastur bajarilish vositalari va komanda qatori chaqirilguncha yuboriladi. -
Bu orqaga zudlikda
LivenessState.CORRECTbilanAvailabilityChangeEventhodisasi yuboriladi, bu dastur ishga tushganligini ko'rsatadi. -
ApplicationReadyEventhodisasi har qanday dastur bajarilish vositalari va komanda qatori chaqirilgandan keyin yuboriladi. -
Bu orqaga zudlikda
ReadinessState.ACCEPTING_TRAFFICbilanAvailabilityChangeEventhodisasi yuboriladi, bu dastur so'rovlarni qayta ishlashga tayyorligini bildiradi. -
Agar ishga tushirishda istisno yuzaga kelsa,
ApplicationFailedEventhodisasi 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:
-
WebServerInitializedEventhodisasiWebServertayyor bo'lganda yuboriladi.ServletWebServerInitializedEventvaReactiveWebServerInitializedEventmos ravishda servlet va reaktiv server variantlari hisoblanadi. -
ContextRefreshedEventhodisasi, agarApplicationContextyangilansa, yuboriladi.
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,
AnnotationConfigServletWebServerApplicationContextishlatiladi -
Agar Spring MVC mavjud bo'lmasa va Spring WebFlux mavjud bo'lsa,
AnnotationConfigReactiveWebServerApplicationContextishlatiladi -
Aks holda
AnnotationConfigApplicationContextishlatiladi
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.
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:
@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. } }
@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. } }
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.
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:
@Component public class MyCommandLineRunner implements CommandLineRunner { @Override public void run(String... args) { // biror ish qilamiz... } }
@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:
@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))); } }
@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.
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:
@SpringBootApplication public class MyApplication { public static void main(String[] args) { SpringApplication application = new SpringApplication(MyApplication.class); application.setApplicationStartup(new BufferingApplicationStartup(2048)); application.run(args); } }
@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.
GO TO FULL VERSION