Barcha savollar

60+ eng ko'p beriladigan Spring Boot intervyu savollari va javoblari

Navbatdagi Spring Boot intervyusidan muvaffaqiyatli o'tmoqchimisiz? Ko'p beriladigan ushbu Spring Boot intervyu savollari bilan tayyorgarlik ko'ring.

Muallif: William Imoh

Spring Boot intervyusiga tayyorlanish asoslarni bilishdan ko'proq narsani talab qiladi. Spring Boot ilovasi zamonaviy backend tizimlarida qanday ishlashini tushunishingiz kerak.

Spring Boot — Spring framework ekotizimining asosiy qismi bo'lib, Java backend dasturlashida keng qo'llaniladi. Spring Boot auto-configuration, dependency management va production'ga tayyor imkoniyatlarni taqdim etish orqali ilova ishlab chiqishni soddalashtiradi.

Ushbu qo'llanma asosiy fundamental bilimlarni mashq qilishingiz va real hayotdagi vaziyatlarni hal qila olishingizga yordam berish uchun tuzilgan. Birinchi Spring Boot intervyungizga tayyorlanyapsizmi yoki intermediate va senior darajadagi lavozimlarga ko'tarilmoqchimisiz, bu qo'llanma sizga ham nazariy, ham amaliy bilim beradi.

TL;DR

  • 60 dan ortiq keng tarqalgan Spring Boot intervyu savollari va javoblarini mashq qiling.

  • Konfiguratsiyalar, data access, JPA, xavfsizlik, unumdorlik va arxitektura kabi asosiy mavzularni o'rganing.

  • Tizimli o'rganish uchun Spring Boot roadmap'iga amal qiling.

  • Chuqurroq tushuncha olish uchun AI Tutor'dan foydalaning.

Navbatdagi Spring Boot intervyusiga tayyorgarlik

Spring Boot intervyusiga tayyorlanish javoblarni yod olish bilan cheklanmaydi. Spring Boot intervyusidan muvaffaqiyatli o'tishingizga yordam beradigan bir nechta foydali maslahatlar:

  • Asosiy Spring Boot annotation'lari, dependency management, Spring boshqaradigan component'lar, Spring Boot auto-configuration, REST controller'lar, Spring Boot actuator, Spring Data Java Persistence API (JPA) asoslari va exception handling kabi fundamental mavzularni puxta o'zlashtiring.

  • Yuzaki bilim bilan cheklanib qolmang: mavzuni mukammal egallash uchun parda ortida nima sodir bo'lishini o'rganing.

  • Savollar ustida yaxshilab o'ylang, biror vaziyatni ko'z oldingizga keltiring yoki misol sifatida keltiring va intervyu oluvchini fikrlash jarayoningiz bo'ylab yetaklang.

  • Ekotizimdagi so'nggi o'zgarishlar va yangi imkoniyatlardan xabardor bo'lib turing.

Flashcard'lar bilan o'zingizni sinab ko'ring

Ushbu flashcard'lardan foydalanishingiz yoki savollarni ro'yxat ko'rinishida ko'rish uchun quyidagi savollar ro'yxati bo'limiga o'tishingiz mumkin.

Savollar ro'yxati

Agar savollarni ro'yxat ko'rinishida ko'rishni afzal ko'rsangiz, ularni quyida topishingiz mumkin.

Boshlang'ich darajadagi Spring Boot intervyu savollari

Nima uchun Spring framework o'rniga Spring Boot'ni tanlash kerak?

Tezroq sozlash, auto-configuration va minimal konfiguratsiya bilan ishlaydigan embedded server'lar kerak bo'lganda Spring Boot'ni tanlashingiz kerak. Spring Boot'ning Spring framework bilan taqqoslanishi:

Xususiyat Spring Boot Spring Framework
Konfiguratsiya Auto-configuration Qo'lda XML/Java config
Deployment Embedded server Tashqi server talab qilinadi
Sozlash vaqti Tezroq Sekinroq
Production'ga tayyorlik O'rnatilgan qo'llab-quvvatlash mavjud Qo'lda sozlash kerak

Spring Boot'ning asosiy component'lari qaysilar?

Spring Boot'ning asosiy component'lari:

  • Spring Boot Starters: Maven/Gradle sozlashni soddalashtiradigan, oldindan sozlangan dependency to'plamlari.

  • Auto-Configuration: Classpath va property'lar asosida bean'larni avtomatik sozlaydi.

  • Spring Boot Actuator: Production'ga tayyor monitoring endpoint'larini taqdim etadi.

  • Spring Boot CLI: Tezkor prototype yaratish uchun buyruq qatori vositasi.

  • Embedded Server: Ilovalarni tashqi serverni sozlamasdan ishga tushirish imkonini beradi.

@SpringBootApplication qaysi uchta asosiy annotation'ni birlashtiradi?

@SpringBootApplication — uchta asosiy annotation'ni birlashtiruvchi meta-annotation:

  • @Configuration: Sinfni bean definition'lari manbai sifatida belgilaydi.

  • @EnableAutoConfiguration: Boot classpath sozlamalari asosida bean'larni qo'shishni boshlashi kerakligini bildiradi.

  • @ComponentScan: Spring'ga joriy package va sub-package'lardan @Component, @Service, @Controller va @Repository sinflarini qidirishni aytadi.

Spring Boot flow architecture nima?

Spring Boot flow architecture so'rov Spring Boot ilovasi bo'ylab kirish nuqtasidan javob hosil bo'lishigacha qanday harakatlanishini ifodalaydi.

Spring Boot flow architecture

Oddiy Spring Boot ilovasida oqim odatda quyidagi bosqichlardan iborat bo'ladi:

  1. Ilova public static void main method'idan ishga tushadi.

  2. SpringApplication.run() method'i Spring context'ni bootstrap qiladi.

  3. Spring Boot auto configuration yordamida bean'larni avtomatik sozlaydi.

  4. Embedded Tomcat server ishga tushadi.

  5. DispatcherServlet HTTP so'rovni qabul qiladi.

  6. So'rov Controller -> Service layer -> Data access layer'lari bo'ylab o'tadi.

  7. JSON javob qaytariladi.

Spring Boot CLI'dan qachon foydalanish kerak?

Spring Boot CLI (Command Line Interface) — oddiy buyruqlar yordamida Spring Boot ilovasini tezda yaratish va ishga tushirish imkonini beradigan vosita. Spring Boot command line interface tezkor prototype yaratish, qisqa demo'lar yoki Spring component'larini testlash uchun foydali.

Spring Boot DevTools nima va u nima uchun foydali?

Spring Boot DevTools — Spring Boot ilovalarida dasturchi samaradorligini oshiradigan, faqat development uchun mo'ljallangan vosita. U quyidagilarni taqdim etadi:

  • Kodda o'zgarish aniqlanganda ilovani avtomatik restart qilish funksiyasi

  • Resurslar o'zgarganda brauzerni avtomatik yangilaydigan LiveReload qo'llab-quvvatlashi

Spring Boot DevTools bilan local development tajribangiz yaxshilanadi va backend development workflow'ingiz tezlashadi.

IoC Container'ning vazifasi nima?

Inversion of Control (IoC) container Java obyektlarining (ular Bean'lar deb ham ataladi) lifecycle'ini boshqaradi. U kodingizni loosely coupled qiladi va testlashni osonlashtiradi. Sinf instance'larini qo'lda yaratish o'rniga Spring IoC orqali bean'larni yaratish va inject qilishni avtomatik boshqara oladi.

Spring Boot Starter nima va Starter dependency build path'ni qanday soddalashtiradi?

Spring Boot Starter — muayyan funksionallik uchun ko'p ishlatiladigan kutubxonalarni bir guruhga jamlaydigan, oldindan sozlangan dependency to'plami. Bir nechta dependency'ni qo'lda qo'shish o'rniga, kerakli kutubxonalarni avtomatik ravishda o'z ichiga oladigan bitta starter qo'shasiz.

Dependency Injection nima va u IoC'dan qanday farq qiladi?

Dependency Injection — design pattern bo'lib, unda sinf o'ziga kerakli dependency'larni o'zi yaratmasdan, ularni IoC container'dan oladi.

IoC va Dependency Injection o'rtasidagi asosiy farqlar:

Jihat Dependency Injection IoC
Nima ekanligi IoC'ni amalga oshirish mexanizmi Boshqaruvni topshirishning yo'naltiruvchi tamoyili
Qamrov Aniq Keng
Asosiy e'tibor Dependency'lar qanday taqdim etilishi Obyekt yaratilishi va oqimni kim boshqarishi
Amalga oshirish IoC'ni amalga oshirishning bir usuli DI, service locator, template method, event'lar va h.k. yordamida amalga oshirilishi mumkin
Munosabat IoC'ning bir qismi Ota tushuncha

Application properties faylining maqsadi nima?

Spring Boot ilovalarida application properties fayli tashqi konfiguratsiya va muhit property'lari uchun markaziy joy vazifasini bajaradi. Uning maqsadi — Java kodingizni o'zgartirmasdan, ma'lumotlar bazasi URL'lari, server port'lari, credential'lar va logging darajalari kabi ilovaga xos sozlamalarni belgilash.

Spring Boot externalized configuration'ni yana qanday usullarda qo'llab-quvvatlaydi?

Externalized configuration konfiguratsiyani ilova kodidan ajratish imkonini beradi, natijada bitta ilova hech qanday o'zgartirishsiz turli muhitlarda ishlay oladi. Spring Boot environment variable'lar, command-line argument'lar, profile'ga xos fayllar va cloud config server'lar kabi boshqa externalized configuration manbalarini ham qo'llab-quvvatlaydi.

Auto-configuration nima va uning nima qilayotganini qanday ko'rish mumkin?

Auto-configuration — ilovangizni classpath'dagi Spring Boot dependency'lari, Spring context'dagi mavjud bean'lar va konfiguratsiya property'lari asosida avtomatik sozlaydigan xususiyat. Ichki tomondan Spring Boot muayyan bean'lar yaratilishi kerakmi yoki yo'qligini hal qilish uchun har bir auto-configuration sinfi ichidagi shartlarni tekshiradi.

Ilovangizni --debug flag'i bilan ishga tushirib, auto-configuration'lar tafsilotlarini ko'rishingiz mumkin.

Embedded server tushunchasi nima va u nima uchun muhim?

Spring Boot'da server to'g'ridan-to'g'ri ilovaning ichiga o'rnatilgan bo'ladi. spring-boot-starter-web'ni qo'shganingizda, Spring Boot avtomatik ravishda Tomcat kabi embedded server'ni taqdim etadi. Bu ilovani self-contained qiladi, deploy qilishni osonlashtiradi hamda cloud va microservice'larga asoslangan arxitekturalarga mos qiladi.

@Controller va @RestController o'rtasida qanday farqlar bor?

  • @Controller an'anaviy veb-sahifalar uchun ishlatiladi. @RestController — Spring Boot'dagi @Controller va @ResponseBody'ni birlashtiruvchi zamonaviy annotation.

  • @Controller View/HTML qaytaradi. @RestController esa JSON yoki XML ma'lumotlarni to'g'ridan-to'g'ri HTTP response body'da qaytaradi.

Spring Boot'ning default veb-server port'i qaysi va uni qanday o'zgartirish mumkin?

Default veb-server port'i — 8080. Uni application.properties yoki application.yml faylida server.port'ni belgilash orqali yoki ilovani ishga tushirishda command-line argument sifatida berish orqali o'zgartirishingiz mumkin.

Spring Boot loyihasini boshlashning eng tez va samarali usuli qaysi?

Spring Initializr odatda Spring Boot loyihasini tezda yaratib, ishga tushirishning eng tez usuli hisoblanadi. U oldindan sozlangan setup va ishonchli Spring Boot dependency management bilan birga keladi.

@RequestMapping va @GetMapping nima uchun ishlatiladi?

@RequestMapping — HTTP so'rovlarni controller method'lariga map qilish uchun ishlatiladigan umumiy Spring Boot annotation'i. @GetMapping — Spring Boot'da GET so'rovlarni map qilish uchun ishlatiladigan maxsus annotation.

Spring Boot'da qachon @RequestMapping o'rniga @GetMapping'dan foydalanish kerak?

Oddiy GET so'rovlar uchun @GetMapping'dan, bir nechta HTTP method'larini qo'llab-quvvatlash kabi ko'proq moslashuvchanlik kerak bo'lganda esa @RequestMapping'dan foydalaning.

Spring Boot Actuator'ning maqsadi nima?

Spring Boot Actuator production'ga tayyor observability imkoniyatlarini taqdim etadi. U ilovangiz ishlab turgan paytda uni monitoring qilish, boshqarish va u haqida chuqur ma'lumot olishga yordam beradi. Sizda /health, /metrics va /info kabi Spring Boot Actuator endpoint'lari mavjud bo'lib, ular ilovangiz deploy qilingandan keyin uning health holati va unumdorligini kuzatish imkonini beradi.

Nima uchun obyekt new bilan yaratilish o'rniga Spring bean bo'lishi kerak?

new bilan yaratilgan obyektlar Spring nazoratidan tashqarida bo'ladi va dependency injection hamda lifecycle callback'lari kabi imkoniyatlardan foydalana olmaydi.

DispatcherServlet nima?

DispatcherServlet — Spring MVC ilovasidagi barcha HTTP so'rovlar uchun markaziy kirish nuqtasi. U so'rovlarni qabul qiladi va ularni qayta ishlashni tegishli component'larga topshiradi.

Client /users/1 manziliga so'rov yuborganda DispatcherServlet uni qanday qayta ishlaydi?

DispatcherServlet:

  • So'rovni qabul qilib oladi.

  • HandlerMapping orqali UserController.getUserById()'ni topadi.

  • Uni HandlerAdapter orqali chaqiradi.

  • Qaytarilgan obyektni HttpMessageConverter yordamida JSON'ga aylantiradi.

  • Client'ga javob yuboradi.

Component scanning nima va uning afzalliklari qanday?

Component scanning — Spring classpath'ingizni @Component, @Service, @Repository va @Controller kabi stereotype'lar bilan belgilangan sinflarni topish uchun skanerlab, bean'larni application context'da avtomatik aniqlaydigan va ro'yxatdan o'tkazadigan jarayon.

Bu jarayon boilerplate konfiguratsiyani olib tashlashga yordam beradi, bean boshqaruvini Spring Boot loyihangiz doirasida saqlaydi hamda kodingizni modulli va qo'llab-quvvatlash oson qiladi.

O'rta darajadagi Spring Boot intervyu savollari

Spring Boot dependency management versiyalarni qo'lda kiritmasdan qanday umumlashtiradi?

Spring Boot dependency management spring-boot-starter-parent orqali taqdim etiladigan BOM'dan (Bill of Materials) foydalanadi. Ushbu BOM keng tarqalgan kutubxonalar uchun bir-biriga mos versiyalarni belgilaydi, shuning uchun pom.xml faylida versiyalarni ko'rsatishingiz shart emas. Bu kutubxonalar o'rtasidagi moslikni ta'minlaydi, versiya konfliktlarining oldini oladi, loyihani sozlashni soddalashtiradi va texnik xizmat ko'rsatish bilan bog'liq ortiqcha yukni kamaytiradi.

CommandLineRunner interfeysi nima va u qachon foydali?

CommandLineRunner — Spring Boot'dagi functional interface bo'lib, u Spring application context to'liq yuklangandan keyin, lekin ilova so'rovlarni qayta ishlashni boshlashidan oldin kodni ishga tushirish imkonini beradi.

Bu ayniqsa quyidagi holatlarda foydali:

  • Ma'lumotlar bazasiga boshlang'ich ma'lumotlarni seed qilish

  • Job'larni rejalashtirish yoki keshlarni initsializatsiya qilish kabi ishga tushish vazifalarini bajarish

Profile'ga xos konfiguratsiya fayllaridan foydalanilganda Spring Boot'da property'lar qanday tartibda yuklanadi?

Spring Boot freymvorkida property'lar belgilangan ustuvorlik tartibida yuklanadi. Bir nechta manba bir xil property'ni belgilaganda, ustuvorligi yuqoriroq bo'lgan manba qolganlarini override qiladi. Aniqroq va tashqi manbalar umumiyroq va ichki manbalarni override qiladi.

Masalan, Spring Boot loyihangizda dev profile faol bo'lganda, application-dev.properties application.properties. faylida belgilangan bir xil property'larni override qiladi.

Spring Boot externalized configuration

@Primary va @Qualifier'ni tushuntiring

Spring Boot'da @Primary va @Qualifier ikkalasi ham application context'da bir xil type'dagi bir nechta bean mavjud bo'lganda noaniqlikni bartaraf etish uchun ishlatiladi. Bu Spring Boot annotation'lari bir xil type'dagi bir nechta bean mavjud bo'lganda Spring qaysi bean'ni inject qilishni hal qilishiga yordam beradi.

@Primary va @Qualifier o'rtasida ba'zi farqlar bor:

@Primary @Qualifier
Default bean'ni belgilaydi Muayyan bean'ni tanlaydi
Bean definition'da qo'llaniladi Injection nuqtasida qo'llaniladi
Qualifier ko'rsatilmaganda ishlatiladi @Primary'ni override qiladi

Global exception handling nima?

Spring Boot'da global exception handling ilova xatolarini har bir controller'da alohida qayta ishlash o'rniga markaziy joyda boshqarishni anglatadi. @RestControllerAdvice'ni @ExceptionHandler bilan birga ishlatib, global exception handling'dan foydalanish har bir controller'da try-catch bloklarini yozish zaruratini yo'q qiladi. Moslashtirilgan xato javoblari uchun @ResponseEntityExceptionHandler'dan foydalaning.

Spring Boot'dagi Singleton bean'lar thread safety'ni kafolatlaydimi?

Singleton bean'lar thread safety'ni avtomatik ravishda kafolatlamaydi. Singleton bean'larda har bir IoC container uchun faqat bitta instance bo'ladi, lekin unga bir vaqtning o'zida bir nechta thread murojaat qilishi mumkin. Bean'larning xavfsizligini ularning state'i belgilaydi. Agar spring bean'da mutable state bo'lsa, concurrent murojaat race condition'larga yoki nomuvofiq xatti-harakatga olib kelishi mumkin.

Spring Security'da DelegatingFilterProxy'ning vazifasi nima?

DelegatingFilterProxy Servlet container va Spring boshqaradigan filter bean o'rtasida ko'prik vazifasini bajaradi. Client HTTP so'rov yuborganda, container DelegatingFilterProxy'ni chaqiradi, u esa FilterChainProxy bean'ini oladi. Authentication, authorization, CSRF va session management filter'laridan iborat to'liq Spring Security filter chain'ini aynan FilterChainProxy bean'i bajaradi.

Nima uchun production'da ma'lumotlar bazasi schema o'zgarishlarini boshqarishda Hibernate'ning ddl-auto'sidan ko'ra Flyway afzal ko'riladi?

Flyway quyidagilarda ustunlik qiladi:

  • Version control: Har bir schema o'zgarishi versiyalangan migration skripti sifatida yoziladi va source control'ga commit qilinadi.

  • Bashorat qilinuvchanlik: Flyway aniq yozilgan SQL'ni bajaradi va migration'larni aniq belgilangan tartibda ishga tushiradi.

  • Production'ga xavfsizroq deploy qilish: Flyway fail-fast mexanizmidan foydalanadi: agar migration muvaffaqiyatsiz tugasa, ilovaning ishga tushishi ham muvaffaqiyatsiz bo'ladi.

  • Muhit property'larining izchilligi: Flyway barcha muhit property'lari bir xil migration'lar, versiya tartibi va schema holatini qo'llashini ta'minlaydi.

  • Murakkab o'zgarishlar va data migration'lar: Flyway data migration'lar, index yaratish, constraint'larni yangilash va performance tuning o'zgarishlarini qo'llab-quvvatlaydi

Soft delete nima va uni Spring Data JPA'da qanday amalga oshirish mumkin?

Spring Data JPA'da soft delete satrni haqiqatda o'chirmasdan, uni o'chirilgan deb belgilashni anglatadi. Bu ma'lumotlarni yaxshiroq tiklash, audit/tarixni saqlash, regulatory compliance va debugging'ni yaxshilash imkonini beradi. Soft delete'ni deleted flag'i yoki deletedAt timestamp ustuni yordamida amalga oshirishingiz mumkin.

Self-injection nima va u nima uchun ishlatiladi?

Self-injection — Spring bean method'larni to'g'ridan-to'g'ri this orqali chaqirish o'rniga, Spring container orqali o'ziga reference inject qiladigan jarayon. self.method() chaqirilganda chaqiruv proxy orqali o'tadi va Spring Boot annotation'lari to'g'ri ishga tushadi.

Self-injection proxy pitfall muammosini hal qilish uchun ishlatiladi: bunda method this orqali chaqirilganda Spring proxy'lari chetlab o'tiladi va bu @Transactional, @Async yoki @Cacheable kabi annotation'larning qo'llanishiga to'sqinlik qiladi.

Rollar asosida muayyan API endpoint'larini qanday himoyalash mumkin?

Muayyan endpoint'larga kirishni cheklashning ikkita keng tarqalgan yondashuvi bor:

  • URL-based security: SecurityFilterChain bean'ingizda kirish qoidalarini sozlashni o'z ichiga oladi.

  • Method-level security: @EnableMethodSecurity'ni yoqib, method'larni @PreAuthorize("hasRole('ADMIN')") bilan belgilash orqali service yoki controller method'lari ichida ko'proq nazoratga ega bo'lish uchun ishlatiladi.

URL-based va method-level security yondashuvlarining afzallik va kamchiliklari qanday?

Yondashuv Afzalliklari Kamchiliklari
URL-based Markazlashgan nazoratni beradi va barcha endpoint qoidalarini ko'rish oson Murakkab biznes qoidalari uchun moslashuvchanligi kamroq
Method-level Granular nazorat beradi, service layer ichida ishlaydi va dinamik tekshiruvlarni qo'llab-quvvatlaydi Method security'ni yoqishni talab qiladi va barcha qoidalarni bir joyda ko'rish qiyinroq

Spring Data repository'laridagi Iterable, List, Slice va Page return type'larini sodda tushuntiring.

  • Iterable — eng oddiy collection type. U barcha mos keladigan yozuvlarni Iterable sifatida qaytaradi. U eng yaxshi mos keladigan holatlar — natijalarni faqat loop orqali aylanib chiqish kerak bo'lganda va xotira overhead'i minimal bo'lishi kerak bo'lganda.

  • List — standart Java List. U barcha yozuvlarni xotiraga yuklaydi. Uning eng yaxshi qo'llanish holatlari — natijalarning umumiy soni kichik bo'lganda va standart collection operatsiyalarini bajarmoqchi bo'lganingizda.

  • Slice — natijalar to'plamining bir bo'lagini ifodalovchi ma'lumotlar chunk'i. U faqat joriy ma'lumotlar chunk'ini oladi. Uning eng yaxshi qo'llanish holati — 'Load More' tugmalari yoki infinite scrolling'ni amalga oshirish.

  • Page — Slice'ning kengaytmasi, lekin unda pagination metadata'si ham bo'ladi. U joriy ma'lumotlar chunk'ini oladi va sahifalarning umumiy sonini bilish uchun count query bajaradi. Uning eng yaxshi qo'llanish holati — raqamlangan pagination.

Spring Boot'da @Lazy nima va u unumdorlikka qanday ta'sir qiladi?

@Lazy Spring bean'ning yaratilishini u haqiqatan kerak bo'lgunga qadar kechiktiradi. U Spring container'ga Spring bean'ni ilova ishga tushishi bilanoq darhol yaratmaslikni aytadi, holbuki default xatti-harakat aynan shunday. Bean'ni @Lazy bilan belgilaganingizda, Spring proxy obyekt yaratadi va haqiqiy bean'ning instance'ini faqat u birinchi marta so'ralganda yoki ishlatilganda yaratadi.

Spring Boot'da @Component, @Service, @Repository va @Controller o'rtasidagi farq nima?

Spring Boot'da bu annotation'lar bir necha jihatdan farq qiladi:

Jihat @Component @Service @Repository @Controller
Vazifa Umumiy Biznes mantiq Data access Web/HTTP
Arxitektura layer'i Istalgan Service Persistence Presentation
Maxsus xatti-harakat Yo'q Tavsiflovchi Exception handling Request handling
Exception translation Yo'q Yo'q Ha Yo'q
HTTP so'rovlarni qayta ishlaydi Yo'q Yo'q Yo'q Ha

Frontend backend API'ga murojaat qila olishi uchun CORS'ni qanday sozlaysiz?

Spring Boot'da CORS kerakli kirish doirasiga qarab global yoki controller darajasida lokal sozlanishi mumkin.

Agar frontend'ingiz ko'plab endpoint'larga murojaat qilishi kerak bo'lsa, CORS'ni global sozlang.

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class GlobalCorsConfig {
    @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurer() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                // Apply CORS settings to all endpoints
                registry.addMapping("/**")
                        .allowedOrigins("http://localhost:3000") 
                        .allowedMethods("GET", "POST", "PUT", "DELETE") 
                        .allowedHeaders("*"); 
            }
        };
    }
}

Agar cross-origin kirishni muayyan endpoint'lar bilan cheklamoqchi bo'lsangiz, uni controller darajasida sozlang.

import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController; 

@RestController
@CrossOrigin(origins = "http://localhost:3000")
public class UserController {                                              
    @GetMapping("/users")
    public String getUsers() {
        return "List of users";
    }
     @GetMapping("/admin")
    @CrossOrigin(origins = "http://localhost:4000")
    public String getAdmin() {
        return "Admin panel";
    }
}

Spring MVC'da content negotiation nima?

Content negotiation — Spring client'ga qaytariladigan javobning media type'ini aniqlaydigan jarayon. U client so'roviga qarab JSON, XML, matn yoki HTML qaytarishni hal qiladi. Client so'rov yuborganda, Spring avval Accept header'ini tekshiradi, keyin mos HttpMessageConverter'ni topadi va qaytarilgan Java obyektini so'ralgan formatga aylantiradi.

Spring Boot'da property validation uchun qaysi annotation'lardan foydalanasiz?

Data Transfer Object (DTO) field'larida @NotNull, @Size va @Email kabi annotation'lar bilan bean validation'dan foydalaning, controller method'larida esa @Valid'ni ishlating. Noto'g'ri input kelganda MethodArgumentNotValidException tashlanadi.

@Value va @ConfigurationProperties o'rtasida qanday farqlar bor?

Ikkala yondashuv ham konfiguratsiya property'larini ilovangizga inject qilish uchun ishlatiladi, lekin ular o'rtasida bir qancha farqlar bor.

Xususiyat @Value @ConfigurationProperties
Qamrov Bitta property Property'lar guruhi
Murakkablik Oddiy Tuzilmali va ierarxik
Validation Cheklangan Bean validation'ni qo'llab-quvvatlaydi
O'qilishi Ko'p property'lar uchun past Property'lar uchun yuqori
Eng yaxshi qo'llanish holati Bir martalik property'lar Butun ilova bo'yicha config'lar

Spring Boot'da method'ni qanday qilib asinxron ishlatish mumkin va buni nima uchun qilasiz?

Spring Boot'da async method'larni konfiguratsiya sinfiga @EnableAsync'ni qo'shib, method'ni @Async bilan belgilash orqali yoqasiz. Bu method'ni alohida thread'da ishlashga majbur qiladi va chaqiruvchi kutmasdan ishini davom ettira oladi.

Bu ayniqsa email yuborish, tashqi API'larni chaqirish yoki background operatsiyalarni bajarish kabi vazifalar uchun foydali.

Spring Boot'da endpoint'larni qanday himoyalaysiz?

Endpoint'larga kirish Spring Security yordamida nazorat qilinadi: HttpSecurity orqali qaysi URL'lar authentication talab qilishi va qaysi rollar ularga kira olishi belgilanadi. Bu maxfiy endpoint'larga faqat ruxsati bor foydalanuvchilar kira olishini ta'minlaydi.

Stateless, token-based authentication uchun JWT yoki OAuth2 bilan birgalikda ishlating. Method-level security uchun @PreAuthorize yoki @Secured'dan foydalaning.

Yuqori darajadagi Spring Boot intervyu savollari

Ahead-of-Time (AOT) processing nima va u nima uchun muhim?

AOT processing — ilovangizni ishga tushishidan oldin tahlil qiladigan va runtime'da bajariladigan ishni kamaytirish uchun kod generatsiya qiladigan build-time optimallashtirish usuli.

Ilovangizni build qilganingizda Spring:

  • Konfiguratsiyangizni tahlil qilib, qaysi bean'larning instance'ini yaratish, qaysi proxy'larni yaratish va qanday reflection hint'larini qo'shish kerakligini aniqlaydi.

  • So'ngra runtime reflection mantiqining o'rnini bosadigan optimallashtirilgan source code generatsiya qiladi.

Bu mexanizm quyidagilarga olib keladi:

  • Startup vaqtining tezlashishi

  • Kamroq memory footprint

  • Native image qo'llab-quvvatlashini yoqadi

Circular dependency nima va u keltirib chiqaradigan muammoni qanday hal qilasiz?

Circular dependency ikki yoki undan ortiq bean bevosita yoki bilvosita bir-biriga bog'liq bo'lib, dependency sikli hosil qilganda yuzaga keladi. Har bir bean boshqasiga bog'liq bo'lgani uchun freymvork qaysi birini initsializatsiya qilishni aniqlay olmaydi va natijada ilova ishga tushishda xatoga uchraydi.

Circular dependency'lar dizayn muammosi bo'lgani uchun eng yaxshi yechim — abstraction orqali decoupling qilib, ilovangiz dizaynini refactor qilish. Ikki yoki undan ortiq service o'rtasiga interfeys kiritish orqali circular dependency bartaraf etiladi. Shuningdek, constructor injection yoki field injection'ni tanlash circular dependency'lar qanday aniqlanishi va hal qilinishiga ta'sir qiladi.

Katta Spring Boot ilovalarida xotira sarfi va startup'ni optimallashtirish uchun qanday usullardan foydalanish mumkin?

  • Lazy initialization'dan foydalaning: Bean'lar faqat birinchi marta ishlatilganda yaratilishi kerak.

  • AOT processing'ni yoqing: Bean wiring va proxy'larni build vaqtida oldindan hisoblab qo'ying.

  • Auto-configuration'ni cheklang: Keraksiz bean'lar va starter modullarining yuklanishiga yo'l qo'ymaslik uchun @SpringBootApplication(exclude = ...) yoki spring.autoconfigure.exclude'dan foydalaning.

  • Proxy'larni optimallashtiring: Proxy overhead'ini kamaytirish uchun @Configuration(proxyBeanMethods = false)'dan foydalaning.

  • Profile'ga asoslangan konfiguratsiyadan foydalaning: @Profile yordamida har bir muhit uchun faqat kerakli bean'larni yuklang.

  • Native image'lardan foydalaning: Startup vaqtini qisqartirish uchun GraalVM native image'dan foydalaning.

Spring Boot bilan virtual thread'lardan foydalanishning afzalliklari va e'tiborga olish kerak bo'lgan jihatlari qanday?

Virtual thread'lar ilovangizni quyidagi jihatlarda yaxshilashi mumkin:

  • Thread exhaustion yuzaga kelmasdan juda ko'p concurrent so'rovlarni qayta ishlash

  • Yaxshi scale bo'ladigan oddiy kod yozish

  • Samarali cloud deployment va serverless ishga tushirish

  • Kamroq xotira sarfi

Ilovangizda virtual thread'lardan foydalanishning trade-off'lari ham bor, masalan:

  • Virtual thread'lar to'g'ri integratsiya qilinishi uchun Java 21+ va container qo'llab-quvvatlashini talab qiladi.

  • Ishni an'anaviy thread'larga topshirish scalability afzalliklarini cheklashi mumkin.

  • Virtual thread'lar CPU yadrolari bilan cheklanishi mumkin.

spring.factories va AutoConfiguration.imports o'rtasida qanday farqlar bor?

Xususiyat spring.factories AutoConfiguration.imports
Joylashuv META-INF/spring.factories META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
Format Key-value juftliklari Oddiy sinflar ro'yxati
Loader SpringFactoriesLoader Optimallashtirilgan AutoConfiguration loader
Unumdorlik Biroz sekinroq Sezilarli darajada tezroq
Qamrov Ko'plab extension point'lar uchun ishlatiladi Faqat auto-configuration uchun mo'ljallangan
Holat Legacy (qisman qo'llab-quvvatlanadi) Tavsiya etilgan yondashuv, to'liq qo'llab-quvvatlanadi

Spring Boot microservices arxitekturasida distributed transaction'larni qanday boshqarasiz?

Microservices arxitekturasida har bir service o'z ma'lumotlariga ega bo'ladi va aloqa tarmoq chaqiruvlari orqali amalga oshiriladi. Yagona umumiy transaction manager'ning yo'qligi distributed transaction muammosini keltirib chiqaradi.

Bu muammoni hal qilishning ikkita asosiy strategiyasi bor:

  • Saga Pattern: Bu pattern distributed transaction'ni har biri o'z service'i tomonidan boshqariladigan kichikroq local transaction'larga bo'ladi. Agar biror qadam muvaffaqiyatsiz bo'lsa, oldingi amallarni bekor qilish uchun compensating transaction bajariladi.

  • Two-Phase Commit (2PC): 2PC — Prepare hamda Commit yoki Rollback bosqichlarini o'z ichiga olgan an'anaviy distributed transaction protokoli. U transaction'lar o'rtasidagi strong consistency'ni ustuvor qo'yadi.

Custom Starter'larda @ConditionalOnMissingBean ichki tomondan qanday ishlaydi?

@ConditionalOnMissingBean custom Spring Boot starter foydalanuvchilariga default bean auto-configuration'ni override qilish imkonini beradi. Ichki tomondan auto-configuration jarayonida har bir auto-configuration sinfi quyidagi tartibda qayta ishlanadi:

  • Spring conditional annotation'larni baholaydi.

  • U context'da bean type'i va nomini (agar ko'rsatilgan bo'lsa) tekshiradi.

  • Agar moslik topilsa, shart bajarilmaydi va bean method'i ishga tushirilmaydi.

N+1 muammosini va uni hal qilishning eng yaxshi usulini tushuntiring.

N+1 muammosi — JPA/Hibernate'da keng tarqalgan unumdorlik muammosi bo'lib, unda bitta query parent entity'larni oladi, so'ngra tegishli child entity'larni olish uchun qo'shimcha N ta query bajariladi. Bu ma'lumotlar bazasiga haddan tashqari ko'p murojaat qilinishiga va past unumdorlikka olib keladi.

Bu muammoni hal qilishning bir nechta usuli bor:

  1. JOIN FETCH'dan foydalaning: JPA'ni tegishli entity'larni bitta query'da olishga majbur qiladi. Bu yondashuvda:
  • Hibernate bitta SQL query bajaradi.

  • Parent va child'lar birga olinadi.

  1. @EntityGraph'dan foydalaning: Bitta query'da qaysi tegishli entity'lar olinishi kerakligini aniq belgilaydi. Bu yondashuvda:
  • Parent entity olinayotganda uning item'lari ham olinadi.

  • Tegishli entity'lar JOIN yordamida bitta SQL query'da olinadi.

@Transactional'dagi Proxy Pitfall nima va uni qanday tuzatasiz?

Proxy Pitfall — keng tarqalgan muammo bo'lib, unda @Transactional method xuddi shu sinf ichidagi boshqa method'dan chaqirilganda transaction boshlamaydi. Buning sababi shundaki, Spring @Transactional'ni Aspect-Oriented Programming (AOP) proxy'lari yordamida amalga oshiradi, ichki method chaqiruvlari esa proxy'ni chetlab o'tadi.

Proxy Pitfall'ni quyidagicha tuzatishingiz mumkin:

  • Transactional method'ni boshqa bean'ga ko'chirish. Bu tavsiya etilgan yondashuv.

  • Self-proxy'ni inject qilish.

Monolithic Filter'dan foydalanmasdan microservice'ni qanday himoyalaysiz?

Microservices arxitekturasining xavfsizligi markazlashmagan, stateless, scalable va har bir service uchun mustaqil bo'lishi kerak. Ushbu standartga mos keladigan zamonaviy yondashuv — JSON Web Token (JWT) bilan OAuth2 Resource Server'dan foydalanish.

Bu yondashuvda har bir microservice Resource Server vazifasini bajaradi. Jarayon quyidagicha kechadi:

  1. Foydalanuvchi Identity Provider (IdP) orqali authentication'dan o'tadi.

  2. IdP JWT beradi.

  3. Client ushbu JWT'ni Authorization header'ida yuboradi.

  4. Har bir microservice bir qator amallarni bajaradi: masalan, JWT'ni lokal tarzda validatsiya qiladi, IdP'ning public key'i yordamida imzoni tekshiradi, rollarni ajratib oladi va kirishga ruxsat beradi.

Spring Boot microservices tizimi uchun distributed rate limiting strategiyasini qanday loyihalaysiz?

  • Rate limiting qayerda qo'llanilishini hal qiling. Microservices'da rate limiting default holatda har bir service ichida joylashmasligi kerak.

  • Distributed token koordinatsiyasi uchun Redis'dan foydalaning. API Gateway enforcement nuqtasi vazifasini bajaradi, Redis esa umumiy consistency layer'i rolini o'ynaydi.

  • To'g'ri algoritmni tanlang. Bu Fixed Window, Sliding Window, Token Bucket yoki Leaky Bucket bo'lishi mumkin.

  • Rate limit uchun key'ni qanday tanlashni hal qiling. Ba'zi keng tarqalgan key'lar: IP bo'yicha, user ID bo'yicha, API key bo'yicha, tenant bo'yicha va client ilova bo'yicha.

  • Burst traffic'ni qanday boshqarish strategiyasini ishlab chiqing. Rate limiter burst tolerance va barqaror throughput nazoratini bir-biridan farqlay oladigan qilib loyihalanishi kerak.

  • Redis ishdan chiqsa qo'llaniladigan strategiyalarni belgilang. Public API'lar uchun Redis ishdan chiqqanda traffic'ni o'tkazib yuboring va buni monitoring alert'lari bilan birga qo'llang.

Proxy'lar bean lifecycle'ining qaysi bosqichida yaratiladi va buning natijasida qanday muammolar yuzaga kelishi mumkin?

Proxy'lar bean lifecycle'ining post-initialization bosqichida, aniqrog'i BeanPostProcessor.postProcessAfterInitialization() ichida yaratiladi. Bu bosqichda yuzaga kelishi mumkin bo'lgan muammolar:

  • @Transactional constructor'larda ishlamaydi.

  • Ichki method chaqiruvlari transaction'larni chetlab o'tadi.

  • @PostConstruct proxy'da emas, raw obyektda ishlaydi.

  • Self-invocation AOP'ni buzadi, chunki proxy orqali o'tadigan chaqiruvlar intercept qilinadi.

WebClient va RestClient o'rtasida qanday farqlar bor? Ularning arxitekturaviy oqibatlarini muhokama qiling.

WebClient va RestClient o'rtasidagi asosiy farqlar:

Xususiyat WebClient RestClient
Turi Reactive HTTP client (Project Reactor) Blocking HTTP client
Thread'lardan foydalanish Event-loop Har bir so'rovga bitta thread
Backpressure Qo'llab-quvvatlanadi Qo'llab-quvvatlanmaydi
Nimaning o'rnini bosadi RestTemplate (reactive muqobil) RestTemplate (zamonaviy blocking almashtiruvchi)

Arxitekturaviy oqibatlar

WebClient bilan:

  • Debugging qiyinroq.

  • Har bir so'rov uchun xotira sarfi kamroq.

  • Context switching kamayadi.

  • Yuqori latency'li, I/O'ga og'ir tizimlarda scalability yaxshiroq.

RestClient bilan:

  • Debugging osonroq.

  • Yuklama ostida xotira sarfi ortadi.

  • Concurrency ortishi bilan context switching overhead'i ham ortadi.

  • Scale qilish uchun ko'proq thread kerak bo'ladi.

Actuator'da liveness va readiness probe'lari qanday ishlaydi?

Kubernetes'da liveness va readiness probe'lari orchestrator'ga container qayta ishga tushirilishi kerakmi yoki traffic qabul qilishi kerakmi, shuni aniqlash imkonini beradi. Spring Boot Actuator quyidagi endpoint'larni taqdim etadi:

  • /actuator/health/liveness application context ishlayotganini va buzilgan holatda emasligini tekshiradi.

  • /actuator/health/readiness ma'lumotlar bazasiga ulanish yoki downstream service'lar kabi tashqi dependency'larga bog'liq.

Spring Data JPA'da optimistic locking'ni qanday boshqarasiz?

Optimistic locking — bir nechta transaction bir xil yozuvni o'zgartirganda yangilanishlar yo'qolishining oldini oladigan concurrency control mexanizmi. Uni entity'ingizga int, long yoki timestamp turidagi @Version field'ini qo'shish orqali yoqasiz. Entity har safar yangilanganda Hibernate versiya qiymatini avtomatik ravishda oshiradi va uni SQL statement'ning WHERE qismiga qo'shadi.

Spring Data JPA'dagi projection interfeyslari nima?

Projection interfeyslari butun obyektni yuklash o'rniga entity'dan faqat muayyan field'larni olish imkonini beradi. Spring Data bu interfeysni runtime'da dinamik ravishda implement qiladi va query natijalarini ularga map qiladi. Interfeysda entity field'lariga mos keladigan getter method'lar belgilanganda, generatsiya qilingan SQL faqat so'ralgan ustunlarni tanlaydi.

Spring Data JPA projection'larning uch turini qo'llab-quvvatlaydi:

  • Closed Projections

  • Open Projections

  • Nested projections

Uzoq davom etadigan vazifalarda graceful shutdown'ni qanday amalga oshirasiz?

Spring Boot'dagi graceful shutdown ilova yangi so'rovlarni qabul qilishni to'xtatishini, shu bilan birga joriy va uzoq davom etadigan vazifalar xavfsiz yakunlanishiga imkon berishini ta'minlaydi. Uni application properties faylingizda server.shutdown=graceful'ni belgilash orqali yoqasiz. Shutdown boshlanganda embedded server yangi ulanishlarni qabul qilishni to'xtatadi, mavjud so'rovlarga esa belgilangan vaqt ichida yakunlanishiga ruxsat beriladi.

Spring Boot ishlatadigan ObjectMapper'ni qanday moslashtirasiz?

Spring Boot Jackson yordamida JSON serialization va deserialization uchun umumiy ObjectMapper'ni auto-configure qiladi. Mavjud ObjectMapper'ni moslashtirish uchun Jackson2ObjectMapperBuilderCustomizer type'idagi @Bean'ni belgilang. Bu Spring Boot'ning default sozlamalarini saqlab qolgan holda sozlamalarni o'zgartirish imkonini beradi. Natijada controller'lar, HTTP message converter'lar va RESTful veb-servislar bo'ylab izchillik ta'minlanadi hamda nomuvofiq sozlangan mapper'lar sabab bo'ladigan bug'larning oldi olinadi.

Nima uchun field'larda field injection o'rniga constructor injection'dan foydalanish kerak?

Constructor injection field injection'dan afzal ko'riladi, chunki u immutability'ni majburiy qiladi va dependency'larni aniq ko'rinadigan qiladi. Constructor injection obyekt yaratilish vaqtida barcha Spring Boot dependency'lari taqdim etilishini talab qilib, bean doimo yaroqli holatda bo'lishini ta'minlaydi. U kodni tushunarliroq qiladi, immutability'ni qo'llab-quvvatlaydi, circular dependency'larni erta aniqlashga yordam beradi va clean architecture tamoyillariga mos keladi.

Mono va Flux o'rtasida qanday farqlar bor?

Mono va Flux o'rtasidagi farqlar:

Xususiyat Mono Flux
Ta'rif 0 yoki 1 ta elementni ifodalaydi 0 dan N tagacha elementni ifodalaydi
Elementlar soni Bitta qiymat yoki bo'sh Bir nechta qiymat yoki bo'sh
Qo'llanish holati Bitta yozuvni olish, bitta HTTP javob Bir nechta yozuvni streaming qilish, uzluksiz event'lar yoki collection'lar
Operator'lar Transformatsiya, filtrlash va birlashtirish (map, flatMap) Mono bilan bir xil, qo'shimcha ravishda bir nechta element uchun operator'lar (concat, merge)

Spring Boot ilovasining startup vaqtini qanday profile qilasiz?

Context yaratilishi va bean instance'lari yaratilishi qancha vaqt olishini ko'rish uchun logging.level.org.springframework.boot.StartupInfoLogger=DEBUG'ni yoqishingiz mumkin. Chuqurroq, quyi darajadagi tahlil uchun Async Profiler yoki Java Flight Recorder kabi vositalardan foydalaning.

Xulosa

Spring Boot tushunchalarining nozik jihatlarini va ularning real tizimlarda qo'llanilishini puxta o'zlashtirish beqiyos ahamiyatga ega. Kuchli nomzod sifatida ko'rilishingiz uchun Spring Boot bo'yicha bilimingizni mantiqiy bayon qila olishingiz kerak: tushunchalarni ta'riflang, Spring Boot amalga oshirishni qanday soddalashtirishini tushuntiring, dizayn qarorlari va ularning production'dagi oqibatlarini izohlang.

Sizni boshlang'ich darajadan professional darajagacha olib boradigan tuzilmali Java va Spring Boot roadmap'lari mavjud. Shuningdek, mock intervyular va chuqurroq tushunchalar uchun doimo AI Tutor'dan foydalanishni unutmang.

Yo'l xaritalariQo'llanmalarFAQYouTube

yo'lxaritaroadmap.shasosida

Hamjamiyat tomonidan yaratilgan yo'l xaritalari, eng yaxshi amaliyotlar, loyihalar, maqolalar, manbalar va yo'nalishlar — o'z yo'lingizni tanlash va kasbingizda o'sish uchun.

© yo'lxarita·Shartlar·Maxfiylik·

roadmap.sh

Barcha kontent roadmap.sh loyihasidan olingan (© Kamran Ahmed) va shaxsiy o'rganish uchun o'zbek tiliga tarjima qilinmoqda.

Qidiruv

Yo'l xaritalari, loyihalar va savollarni qidiring