Розділ 5 · 29 питань

Spring Spring Boot

29 питань і відповідей у розділі Spring Spring Boot.

Ukrainian Spring Spring Boot Вихідний Markdown
Мовні версії: English Russian Ukrainian

Питання цього розділу

  1. Що таке Dependency Injection?
  2. В чому різниця між constructor, setter та field injection?
  3. Який тип ін’єкції рекомендується і чому?
  4. Що таке Bean в Spring?
  5. Як створити Bean в Spring?
  6. Що таке Bean Lifecycle?
  7. Які етапи є у Bean lifecycle?
  8. Що таке BeanPostProcessor?
  9. Що роблять методи з анотаціями @PostConstruct та @PreDestroy?
  10. Що таке Bean scope?
  11. Які scope існують в Spring?
  12. В чому різниця між singleton та prototype scope?
  13. Що таке proxy в Spring?
  14. Коли Spring створює proxy?
  15. Що таке AOP (Aspect-Oriented Programming)?
  16. Що таке аспект, advice, pointcut, join point?
  17. Що робить анотація @Transactional?
  18. Чому @Transactional не працює при self-invocation?
  19. Як вирішити проблему з self-invocation?
  20. Що таке автоконфігурація в Spring Boot?
  21. Як працює @SpringBootApplication?
  22. Що таке стартер в Spring Boot?
  23. Що робить анотація @ComponentScan?
  24. Що таке @Configuration клас?
  25. В чому різниця між @Component, @Service, @Repository, @Controller?
  26. Що робить анотація @Autowired?
  27. Що робити, якщо є кілька бінів одного типу?
  28. Що таке @Qualifier?
  29. Що таке profiles in Spring?

Навігатор по розділу

29 запитань для підготовки до співбесіди на Middle Java Developer.


📋 Усі запитання

# Запитання Рівень складності
1 Що таке Dependency Injection
2 В чому різниця між constructor, setter та field injection ⭐⭐
3 Який тип ін’єкції рекомендується і чому ⭐⭐
4 Що таке Bean в Spring ⭐⭐
5 Як створити Bean в Spring ⭐⭐
6 Що таке Bean Lifecycle ⭐⭐⭐
7 Які етапи є у Bean lifecycle ⭐⭐⭐
8 Що таке BeanPostProcessor ⭐⭐⭐
9 Що роблять методи з анотаціями @PostConstruct та @PreDestroy ⭐⭐
10 Що таке Bean scope ⭐⭐
11 Які scope існують в Spring ⭐⭐
12 В чому різниця між singleton та prototype scope ⭐⭐
13 Що таке proxy в Spring ⭐⭐⭐
14 Коли Spring створює proxy ⭐⭐⭐
15 Що таке AOP (Aspect-Oriented Programming) ⭐⭐⭐
16 Що таке аспект, advice, pointcut, join point ⭐⭐⭐
17 Що робить анотація @Transactional ⭐⭐⭐
18 Чому @Transactional не працює при self-invocation ⭐⭐⭐
19 Як вирішити проблему з self-invocation ⭐⭐⭐
20 Що таке автоконфігурація в Spring Boot ⭐⭐⭐
21 Як працює @SpringBootApplication ⭐⭐⭐
22 Що таке starter в Spring Boot ⭐⭐
23 Що робить анотація @ComponentScan ⭐⭐⭐
24 Що таке @Configuration клас ⭐⭐⭐
25 В чому різниця між @Component, @Service, @Repository, @Controller ⭐⭐
26 Що робить анотація @Autowired ⭐⭐
27 Що робити, якщо є кілька бінів одного типу ⭐⭐
28 Що таке @Qualifier ⭐⭐
29 Що таке profiles in Spring ⭐⭐

🗺️ Карта залежностей тем

                    ┌──────────────────────────────────────────┐
                    │   DI FUNDAMENTALS (1-3)                  │
                    │   1. Dependency Injection                │
                    │   2. Constructor vs Setter vs Field      │
                    │   3. Best practices                      │
                    └──────────────────┬───────────────────────┘
                                       │
            ┌──────────────────────────┼──────────────────────────┐
            ▼                          ▼                          ▼
    ┌───────────────┐        ┌───────────────┐        ┌────────────────────┐
    │ BEAN CONCEPT   │        │ LIFECYCLE     │        │ SCOPE              │
    │ (4-5)          │        │ (6-9)         │        │ (10-12)            │
    │ 4. Bean        │        │ 6. Lifecycle  │        │ 10. Scope concept  │
    │ 5. Створення   │        │ 7. 12 steps   │        │ 11. Scope types    │
    │                │        │ 8. BPP        │        │ 12. Singleton vs   │
    │                │        │ 9. @PostCon/  │        │     Prototype      │
    │                │        │    @PreDest   │        │                    │
    └───────┬───────┘        └───────┬───────┘        └────────┬───────────┘
            │                        │                        │
            └────────────────────────┼────────────────────────┘
                                     ▼
                    ┌──────────────────────────────────────────┐
                    │   PROXY & AOP (13-19)                    │
                    │   13. Proxy (концепція)                  │
                    │   14. Коли Spring створює proxy          │
                    │   15. AOP                                │
                    │   16. Аспект, advice, pointcut           │
                    │   17. @Transactional                     │
                    │   18-19. Self-invocation проблема        │
                    └──────────────────────────────────────────┘
                                     │
            ┌────────────────────────┼────────────────────────┐
            ▼                        ▼                        ▼
    ┌───────────────┐        ┌───────────────┐        ┌────────────────────┐
    │ SPRING BOOT    │        │ АНОТАЦІЇ      │        │                    │
    │ (20-24)        │        │ (25-29)       │        │                    │
    │ 20. Автоконфіг │        │ 25. @Component │        │                    │
    │ 21. @SpringBoot│        │    @Service...  │        │                    │
    │ 22. Starters   │        │ 26. @Autowired │        │                    │
    │ 23. @CompScan  │        │ 27. Кілька     │        │                    │
    │ 24. @Config    │        │    бінів       │        │                    │
    │                │        │ 28. @Qualifier │        │                    │
    │                │        │ 29. Profiles   │        │                    │
    └───────────────┘        └───────────────┘        └────────────────────┘

🎯 Рекомендований порядок вивчення

🟢 Рівень Junior (тижні 1-2)

Крок Тема Файли Мета
1 DI основи Q1, Q2, Q3 Що таке DI, типи injection, рекомендації
2 Bean концепція Q4, Q5 Bean vs POJO, способи створення
3 Scope Q10, Q12 Singleton vs Prototype
4 Анотації Q25, Q26 @Component vs @Service, @Autowired
5 Spring Boot база Q20, Q22 Автоконфігурація, стартери

🟡 Рівень Middle (тижні 3-4)

Крок Тема Файли Мета
1 Lifecycle Q6, Q7, Q9 Етапи, @PostConstruct/@PreDestroy
2 BPP Q8 BeanPostProcessor, проксирування
3 Scope типи Q11 Request, Session, Application scope
4 Proxy Q13, Q14 CGLIB vs JDK Proxy, коли створюється
5 @Transactional Q17, Q18, Q19 Як працює, self-invocation
6 @SpringBootApplication Q21 Складні анотації, proxyBeanMethods
7 Дозвіл бінів Q27, Q28, Q29 @Qualifier, @Primary, Profiles

🔴 Рівень Senior (тижні 5-6)

Крок Тема Файли Мета
1 Lifecycle deep Q7 (Senior) BPP ordering, early init, circular deps
2 AOP internals Q15, Q16 Spring AOP vs AspectJ, advice types, pointcut matching
3 @Transactional deep Q17 (Senior) Propagation, isolation, rollback rules, ConnectionReleaseMode
4 Autoconfiguration Q20, Q23 Conditional annotations, spring.factories vs .imports, @ComponentScan internals
5 @Configuration internals Q24 Full vs Lite mode, CGLIB proxying, @Bean inter-dependencies
6 Bean creation Q5 (Senior) ImportSelector, ImportBeanDefinitionRegistrar, FactoryBean, GraalVM
7 Proxy & self-invocation Q14, Q18, Q19 All 4 solutions, trade-offs, AopContext

🔗 Ключові зв’язки між темами

Тема: DI та Bean

Q1 (DI) → Q2 (Типи injection) → Q3 (Рекомендації)
     ↓
Q4 (Bean) → Q5 (Створення) → Q25 (@Component vs @Service...)

Ключові зв’язки:

  • Q1 ↔ Q4: DI — принцип, Bean — об’єкт, яким управляє контейнер
  • Q2 ↔ Q3: Constructor injection — рекомендований, але є винятки
  • Q4 ↔ Q5: Bean = концепція, @Component/@Bean = способи створення
  • Q5 ↔ Q23: @ComponentScan — як Spring знаходить @Component-класи

Тема: Lifecycle та Scope

Q6 (Lifecycle) → Q7 (12 кроків) → Q8 (BPP) → Q9 (@PostConstruct)
     ↓
Q10 (Scope) → Q11 (Типи scope) → Q12 (Singleton vs Prototype)

Ключові зв’язки:

  • Q6 ↔ Q8: BPP — ключовий механізм lifecycle (проксирування, ініціалізація)
  • Q7 ↔ Q8: BPP викликаються на кількох етапах lifecycle
  • Q9 ↔ Q17: @PostConstruct НЕ працює з @Transactional (прокси ще немає!)
  • Q10 ↔ Q13: Request/Session scope створюють прокси для впровадження в singleton

Тема: Proxy та AOP

Q13 (Proxy) → Q14 (Коли створюється) → Q15 (AOP) → Q16 (Advice/Pointcut)
     ↓                                      ↓
Q17 (@Transactional) → Q18 (Self-invocation) → Q19 (Рішення)

Ключові зв’язки:

  • Q13 ↔ Q14: Proxy — механізм, Q14 пояснює КОЛИ Spring його створює
  • Q15 ↔ Q17: @Transactional = найчастіший приклад AOP
  • Q17 ↔ Q18: Self-invocation — головна пастка @Transactional
  • Q18 ↔ Q19: 4 рішення: рефакторинг, self-injection, TransactionTemplate, AopContext

Тема: Spring Boot та Анотації

Q20 (Автоконфігурація) → Q21 (@SpringBootApplication) → Q22 (Starters)
     ↓
Q23 (@ComponentScan) → Q24 (@Configuration) → Q25 (@Component/@Service/...)
     ↓
Q26 (@Autowired) → Q27 (Кілька бінів) → Q28 (@Qualifier) → Q29 (Profiles)

Ключові зв’язки:

  • Q20 ↔ Q21: @SpringBootApplication = @Configuration + @ComponentScan + @EnableAutoConfiguration
  • Q21 ↔ Q24: @SpringBootConfiguration = @Configuration з proxyBeanMethods
  • Q23 ↔ Q5: @ComponentScan → ASM-сканування → створення BeanDefinition
  • Q26 ↔ Q27-Q28: @Autowired → кілька бінів → @Qualifier/@Primary

🎓 Шпаргалка: що знати для кожного рівня

🟢 Junior

  • DI = залежності постачаються ззовні, не через new
  • Constructor injection — рекомендований, Field — не рекомендований
  • Bean = об’єкт під управлінням Spring, POJO = звичайний об’єкт
  • @Component, @Service, @Repository, @Controller = stereotype annotations
  • @Autowired = впровадження залежності за типом
  • Singleton = один на весь контекст, Prototype = новий при кожному запиті
  • Spring Boot = автоконфігурація + стартери + embedded сервер

🟡 Middle

  • Bean Lifecycle: Instantiation → Populate → Initialize → Ready → Destroy
  • @PostConstruct НЕ працює з @Transactional (прокси ще немає)
  • BPP — механізм для зміни бінів; через нього працюють @Transactional, @Async
  • CGLIB (підклас) vs JDK Proxy (за інтерфейсом)
  • @Transactional: rollback лише для RuntimeException + Error
  • Self-invocation: виклик @Transactional методу з того ж класу НЕ працює
  • @Primary = бін за замовчуванням, @Qualifier = явний вибір
  • Profiles = різна конфігурація для dev/test/prod

🔴 Senior

  • 3-level cache для циклічних залежностей: singletonObjects, earlySingletonObjects, singletonFactories
  • Full mode (@Configuration) = CGLIB proxy, перехоплює @Bean виклики → singleton. Lite mode = без проксі, кожен виклик = новий екземпляр
  • AOP: Spring AOP (runtime proxy, лише методи) vs AspectJ (compile/load-time weaving, будь-який join point)
  • Autoconfiguration: conditional (@ConditionalOnClass, @ConditionalOnMissingBean), spring.factories → .imports (Boot 2.7+)
  • @Autowired resolution: byType → @Qualifier → @Primary → byName
  • proxyBeanMethods = false: швидший старт, але @Bean inter-calls створюють нові екземпляри
  • Transaction propagation: REQUIRED (default), REQUIRES_NEW, NESTED, тощо.

📝 Формат кожного файлу

Кожен файл містить:

  • 🟢 Junior Level — базове розуміння, прості аналогії, приклади
  • 🟡 Middle Level — внутрішні механізми, типові помилки, практичні приклади
  • 🔴 Senior Level — deep dive, edge cases, production досвід, моніторинг
  • 🎯 Шпаргалка для співбесіди — ключові тези, часті запитання, червоні прапорці, пов’язані теми