Bu qismda Spring Boot haqida batafsil gaplashamiz. Bu yerda siz asosiy funksiyalarni bilib olasiz, ular sizni qiziqtirishi va sozlashingiz uchun mo‘ljallangan.
SpringApplication
SpringApplication klassi Spring dasturini yuklash uchun qulay usulni taqdim etadi, bu main() metodidan boshlanadi. Ko‘p hollarda siz SpringApplication.run statik metodiga vakolatni topshirasiz, quyidagi misolda ko‘rsatilgandek:
@SpringBootApplication public class MyApplication { public static void main(String[] args) { SpringApplication.run(MyApplication.class, args); } }
@SpringBootApplication class MyApplication fun main(args: Array<String>) { runApplication<MyApplication>(*args) }
Dastur ishlayotganida siz quyidagi natijaga o‘xshash narsa ko‘rishingiz kerak:
. ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v2.7.5) 2022-10-20 12:40:17.841 INFO 16284 --- [ main] o.s.b.d.f.s.MyApplication : Starting MyApplication using Java 1.8.0_345 on myhost with PID 16284 (/opt/apps/myapp.jar started by myuser in /opt/apps/) 2022-10-20 12:40:17.849 INFO 16284 --- [ main] o.s.b.d.f.s.MyApplication : No active profile set, falling back to 1 default profile: "default" 2022-10-20 12:40:20.443 INFO 16284 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http) 2022-10-20 12:40:20.455 INFO 16284 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat] 2022-10-20 12:40:20.455 INFO 16284 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.68] 2022-10-20 12:40:20.716 INFO 16284 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext 2022-10-20 12:40:20.716 INFO 16284 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 2566 ms 2022-10-20 12:40:22.045 INFO 16284 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path '' 2022-10-20 12:40:22.073 INFO 16284 --- [ main] o.s.b.d.f.s.MyApplication : Started MyApplication in 4.937 seconds (JVM running for 6.049)
Standart bo‘yicha INFO darajasidagi log xabarlar ko‘rsatiladi, ular ishga tushirish jarayoni haqida muhim ma‘lumotlarni, masalan, dastur kim tomonidan ishga tushirilganligini, ko‘rsatadi. Agar sizga ishlov berishning boshqa darajasi kerak bo'lsa, "Loglarni boshqarish darajalari" bo'limida aytilgandek sozlashingiz mumkin. Dastur versiyasi asosiy sinf paketi versiyasi orqali aniqlanadi. Ishga tushirish haqidagi ma‘lumotlarni logdan o‘chirish spring.main.log-startup-info ni false ga o‘rnatib bajariladi. Bu, shuningdek, faol profil loglarini ham o‘chiradi.
SpringApplication sinfning
logStartupInfo(boolean) metodini qayta yoza olasiz.
Ishga tushirishdagi xatoliklar
Agar sizning dasturni ishga tushirib bo‘lmasa, ro‘yxatdan o‘tgan FailureAnalyzers maxsus xato xabarini taqdim etadi va muammoni hal qilish uchun ma‘lum bir harakatni amalga oshiradi. Masalan, agar veb-dastur 8080 portidan ishga tushirilsa, lekin bu port allaqachon band bo‘lsa, quyidagi kabi xabar ko‘ringan bo‘lsa kerak:
*************************** APPLICATION FAILED TO START *************************** Description: Embedded servlet container failed to start. Port 8080 was already in use. Action: Identify and stop the process that is listening on port 8080 or configure this application to listen on another port.
FailureAnalyzer realizatsiyalarini taqdim etadi, lekin siz o‘zingiznikini qo‘shishingiz mumkin.
Agar hech qanday tahlilchi istisnolarni hal qila olmasa, nima noto‘g‘ri ketganini yaxshiroq tushunish uchun shartlar haqida to'liq hisobot chiqarish mumkin. Buning uchun debug xususiyatni yoqish yoki org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportLoggingListener uchun debug darajasidagi logni yoqish kerak.
Masalan, agar dastur java -jar yordamida ishga tushiriliyotgan bo‘lsa, xususiyat debugni quyidagicha yoqishingiz mumkin:
$ java -jar myproject-0.0.1-SNAPSHOT.jar --debug
So'nggi vaqtda ishga tushirish
SpringApplication dasturda so'nggi vaqtda ishga tushirishni amalga oshirishga imkon beradi. Agar so'nggi ishga tushirish faol bo'lsa, binalar faqat kerak bo'lganda yaratiladi, dastur ishga tushirilayotganda emas. Natijada, so'nggi ishga tushirishni yoqish dastur ishga tushirish vaqtini qisqartirishi mumkin. Veb-dasturda so'nggi ishga tushirishni yoqish ko'p veb-dasturga tegishli binlar HTTP so'rovi olinguncha ishga tushirilmasligini anglatadi.
So'nggi ishga tushirishning kamchiligi shundaki, u dasturdagi xatoni kechikish bilan aniqlanishiga olib kelishi mumkin. Agar noto‘g‘ri sozlangan bin so'nggi vaqtda ishga tushirilsa, xato endi ishga tushirish vaqtida sodir bo‘lmaydi, muammoni bin ishga tushgandan keyin aniqlash mumkin bo‘ladi. Shuningdek, JVM barcha dastur binlarini joylashtirish uchun etarli xotiraga ega ekanligiga ishonch hosil qilish kerak, faqat ishga tushirilganlarini emas. Shu sababli, so'nggi ishga tushirish standart bo‘yicha faol emas va so‘nggi ishga tushirishni yoqishdan oldin JVM kupa hajmini aniq sozlash tavsiya etiladi.
So‘nggi ishga tushirishni dasturiy ravishda SpringApplicationBuilderdagi lazyInitialization metodidan yoki SpringApplicationdagi setLazyInitialization metodidan foydalanib, yoqish mumkin. Bundan tashqari, bu spring.main.lazy-initialization xususiyatidan foydalanib, quyidagi misolda ko'rsatilgandek yoqilishi mumkin:
spring.main.lazy-initialization=true
spring:
main:
lazy-initialization: true
@Lazy(false) annotatsiyasi yordamida aniq "lazy" atributini false qilib belgilash mumkin.
Bannerni sozlash
Ishga tushirishdagi banner faqat classpath ga banner.txt fayl qo'shib yoki spring.banner.location xususiyatini bu fayl joylashuviga o‘rnatish orqali o‘zgartirilishi mumkin. Agar fayl UTF-8 dan boshqa kodlashga ega bo‘lsa, spring.banner.charset xususiyatini o‘rnatish mumkin. Text faylidan tashqari, banner.gif, banner.jpg yoki banner.png rasm faylini classpathga qo'shish yoki spring.banner.image.location xususiyatini o‘rnatish orqali ham ko‘rish mumkin. Rasm ASCII grafik ko‘rinishga aylantiriladi va har qanday tekst banner yuqoriga joylashtiriladi.
banner.txt faylida Environmentda mavjud bo‘lgan har qanday kalitdan foydalanish mumkin, shuningdek quyidagi o‘rinbosarlar:
| O‘zgaruvchi | Tarif |
|---|---|
|
|
Sizning dasturning |
|
|
Sizning dasturning |
|
|
Siz foydalanayotgan Spring Boot versiyasi. Masalan, |
|
|
Siz foydalanayotgan Spring Boot versiyasi, ekranga chiqarish uchun formatlangan (qavsga o‘ralgan va |
|
|
Bu yerda |
|
|
Sizning dasturning |
SpringApplication.setBanner(…) metodini foydalanib, dasturni banner yaratish mumkin.
org.springframework.boot.Banner interfeysidan foydalaning va o‘zingizning
printBanner() metodini amalga oshiring.
Shuningdek, banner System.out(console) ga chiqarilishi kerakmi, log xabarnomasiga (log) yuborilishi kerakmi yoki umuman chiqarilmasligi kerakmi (off) havolasini boshqarish uchun spring.main.banner-mode xususiyatidan foydalanishingiz mumkin.
Chiqayotgan banner quyidagi nom bilan yagona bino sifatida ro`yxatdan o`tadi: springBootBanner.
${application.version} va ${application.formatted-version} xususiyatlari Spring Boot ishga tushirish vositalarini foydalanganda mavjud. Agar jar fayli chiqarilgan bo‘lsa va u java -cp <classpath> <mainclass> orqali ishga tushirilsa, qiymatlar aniqlanmaydi.
Shuningdek, biz har doim chiqarilgan jar fayllarni java org.springframework.boot.loader.JarLauncher orqali ishga tushirishni tavsiya qilamiz. Bu application.* banner o‘zgaruvchilarini ilova yaratilishidan oldin va classpath yaratilishidan oldin ishga tushiradi.
SpringApplication sozlash
Agar standart SpringApplication sozlamalari sizning xohishingizga to‘g‘ri kelmasa, lokal nusxa yaratishingiz va uni sozlashingiz mumkin. Masalan, bannerni o‘chirib qo‘yish uchun quyidagicha yozing:
@SpringBootApplication public class MyApplication { public static void main(String[] args) { SpringApplication application = new SpringApplication(MyApplication.class); application.setBannerMode(Banner.Mode.OFF); application.run(args); } }
@SpringBootApplication class MyApplication fun main(args: Array<String>) { runApplication<MyApplication>(*args) { setBannerMode(Banner.Mode.OFF) } }
SpringApplication ga uzatilgan konstruktor argumentlari Spring binalari uchun konfiguratsiya manbalari hisoblanadi. Ko‘p hollarda bu
@Configuration annotatsiya bilan belgilangan klasslarga havolalardir, lekin ular
@Component annotatsiyaga ega bo‘lgan klasslarga bevosita havolalar ham bo‘lishi mumkin.
Shuningdek, SpringApplicationni application.properties fayli yordamida sozlashingiz mumkin.
Fluid API Builder
Agar siz ApplicationContext iyerarxiyasini (bir nechta kontekstlarni ota-ona/bola munosabatlari bilan) yaratishingiz kerak bo'lsa yoki "fluid" API builderdan foydalanishni afzal ko'rsangiz, SpringApplicationBuilderga murojaat qilishingiz mumkin.
SpringApplicationBuilder bir nechta metod chaqiruvlarini zanjirlash imkonini beradi va ota-ona va bola iyerarxiyasini yaratish imkonini beruvchi parent va child metodlarini o‘z ichiga oladi, quyidagi misolda ko‘rsatilgan:
new SpringApplicationBuilder()
.sources(Parent.class)
.child(Application.class)
.bannerMode(Banner.Mode.OFF)
.run(args);
SpringApplicationBuilder()
.sources(Parent::class.java)
.child(Application::class.java)
.bannerMode(Banner.Mode.OFF)
.run(*args)
ApplicationContext iyerarxiyasini yaratishda ba‘zi cheklovlar mavjud. Masalan, veb-komponentlar
majburiy bola kontekstida bo‘lishi kerak, va bir xil
Environment ota va bola kontekstlari uchun bir xil ishlatiladi.
Ilovalarning mavjudligi
Platformalarda joylashdirilganida, ilovalar Kubernetes protsesslarining yordamida dasturiy mavjudlik holatini platformaga yuborishi mumkin. Spring Boot keng tarqalgan mavjudlik holatlari "liveness" (haqiqiylik) va "readiness" (tayyorlik)ni qo‘llab-quvvatlaydi. Agar siz Spring Bootning "akturator" vositalaridan foydalansangiz, ushbu holatlar ilova holati endpoints guruhlari sifatida namoyish etiladi.
Bundan tashqari, tayyorlik holati ma'lumotlarini o‘z binlaringizga ApplicationAvailability interfeysini qo‘shish orqali olish mumkin.
Liveness holati
Dastur xizmat qilayotganini anglatadi va u haqiqiy ishlash yoki o‘zini tuzatishi mumkin bo'lmagan holatda emasligini bildiradi. "Liveness" holati buzilganida, dasturni qayta ishga tushirish kerak bo‘lgan holatda.
Spring Boot ilovalarining ichki holati asosan Spring uchun ApplicationContext orqali ifodalanadi. Agar ilova konteksti muvaffaqiyatli ishga tushirilgan bo‘lsa, Spring Boot ilovani haqiqiy holatda deb hisoblaydi. Ilovada foydalanish uchun kontest tugatilgan paytdan boshlab haqiqiy deb hisoblanadi.
Readiness holati
Dastur tayyorlik holati, dasturni trafikni qayta ishlashga tayyorligini bildiradi. Readiness buzilgan holat, platformaga dasturni endi trafik yo‘naltirmaslik kerakligini aytadi. Bu ko‘pincha ishga tushirish paytida, CommandLineRunner va ApplicationRunner komponentlari jarayonida yoki dastur juda band yoki boshqa biror sabab bilan qo‘shimcha trafikka tayyor emasligida sodir bo'ladi.
Dastur tayyor deb qabul qilinadi, ilova va buyrug‘lar kiritilganidan so‘ng.
CommandLineRunner va
ApplicationRunner komponentlari orqali bajarilishi kerak, Spring komponenti lifecycle callbacks kabi
@PostConstruct dan foydalanish o‘rniga.
Ilovaning mavjudlik holatini boshqarish
Ilova komponentlari har qanday vaqtda mavjudlik holatini olish yoki ilova holatini yangilash mumkin, ApplicationAvailability interfeysini kiritish orqali. Ko‘pincha, ilovalar davlat yangilanishiga tinglanishi yoki ilovaning davlatini yangilashi kerak.
Masalan, Kubernetes'ning exec testini ma‘lum bir faylni "moslash" qilib, tayyorgarlik davlatini eksport qilish mumkin:
@Component public class MyReadinessStateExporter { @EventListener public void onStateChange(AvailabilityChangeEvent<ReadinessState> event) { switch (event.getState()) { case ACCEPTING_TRAFFIC: // /tmp/healthy faylni yaratish break; case REFUSING_TRAFFIC: // /tmp/healthy faylni o'chirish break; } } }
@Component class MyReadinessStateExporter { @EventListener fun onStateChange(event: AvailabilityChangeEvent<ReadinessState?>) { when (event.state) { ReadinessState.ACCEPTING_TRAFFIC -> { // /tmp/healthy faylni yaratish } ReadinessState.REFUSING_TRAFFIC -> { // /tmp/healthy faylni o'chirish } else -> { // ... } } } }
Shuningdek, dasturni normal holatga qaytarib bo'lmasa, dastur holatini yangilashimiz mumkin:
@Component public class MyLocalCacheVerifier { private final ApplicationEventPublisher eventPublisher; public MyLocalCacheVerifier(ApplicationEventPublisher eventPublisher) { this.eventPublisher = eventPublisher; } public void checkLocalCache() { try { // ... } catch (CacheCompletelyBrokenException ex) { AvailabilityChangeEvent.publish(this.eventPublisher, ex, LivenessState.BROKEN); } } }
@Component class MyLocalCacheVerifier(private val eventPublisher: ApplicationEventPublisher) { fun checkLocalCache() { try { // ... } catch (ex: CacheCompletelyBrokenException) { AvailabilityChangeEvent.publish(eventPublisher, ex, LivenessState.BROKEN) } } }
Spring Boot ilovaning liveness va readiness holatlarini tekshirish uchun Kubernetes HTTP testlarini taqdim etadi.
GO TO FULL VERSION