Spring Spring Boot
29 питань і відповідей у розділі Spring Spring Boot.
Питання цього розділу
- Що таке Dependency Injection?
- В чому різниця між constructor, setter та field injection?
- Який тип ін’єкції рекомендується і чому?
- Що таке Bean в Spring?
- Як створити Bean в Spring?
- Що таке Bean Lifecycle?
- Які етапи є у Bean lifecycle?
- Що таке BeanPostProcessor?
- Що роблять методи з анотаціями @PostConstruct та @PreDestroy?
- Що таке Bean scope?
- Які scope існують в Spring?
- В чому різниця між singleton та prototype scope?
- Що таке proxy в Spring?
- Коли Spring створює proxy?
- Що таке AOP (Aspect-Oriented Programming)?
- Що таке аспект, advice, pointcut, join point?
- Що робить анотація @Transactional?
- Чому @Transactional не працює при self-invocation?
- Як вирішити проблему з self-invocation?
- Що таке автоконфігурація в Spring Boot?
- Як працює @SpringBootApplication?
- Що таке стартер в Spring Boot?
- Що робить анотація @ComponentScan?
- Що таке @Configuration клас?
- В чому різниця між @Component, @Service, @Repository, @Controller?
- Що робить анотація @Autowired?
- Що робити, якщо є кілька бінів одного типу?
- Що таке @Qualifier?
- Що таке profiles in Spring?
Навігатор по розділу
29 запитань для підготовки до співбесіди на Middle Java Developer.
📋 Усі запитання
🗺️ Карта залежностей тем
┌──────────────────────────────────────────┐
│ 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 досвід, моніторинг
- 🎯 Шпаргалка для співбесіди — ключові тези, часті запитання, червоні прапорці, пов’язані теми