Раздел 5 · 29 вопросов

Spring Spring Boot

29 вопросов и ответов в разделе Spring Spring Boot.

Russian Spring Spring Boot Исходный Markdown
Версии по языкам: English Russian Ukrainian

Вопросы этого раздела

  1. Что такое Dependency Injection?
  2. В чём разница между constructor, setter и field injection?
  3. Какой тип injection рекомендуется использовать и почему?
  4. Что такое Bean в Spring?
  5. Как создать Bean в Spring?
  6. Что такое Bean Lifecycle?
  7. Какие этапы жизненного цикла Bean?
  8. Что такое BeanPostProcessor?
  9. Что делают методы с аннотацией @PostConstruct и @PreDestroy?
  10. Что такое scope Bean?
  11. Какие scope существуют в Spring?
  12. В чём разница между singleton и prototype scope?
  13. Что такое прокси в Spring?
  14. Когда Spring создаёт прокси?
  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?

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

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


📋 Все вопросы

# Вопрос Уровень сложности
1 Что такое Dependency Injection
2 В чём разница между constructor, setter и field injection ⭐⭐
3 Какой тип injection рекомендуется использовать и почему ⭐⭐
4 Что такое Bean в Spring ⭐⭐
5 Как создать Bean в Spring ⭐⭐
6 Что такое Bean Lifecycle ⭐⭐⭐
7 Какие этапы жизненного цикла Bean ⭐⭐⭐
8 Что такое BeanPostProcessor ⭐⭐⭐
9 Что делают методы с аннотацией @PostConstruct и @PreDestroy ⭐⭐
10 Что такое scope Bean ⭐⭐
11 Какие scope существуют в Spring ⭐⭐
12 В чём разница между singleton и prototype scope ⭐⭐
13 Что такое прокси в Spring ⭐⭐⭐
14 Когда Spring создаёт прокси ⭐⭐⭐
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. Прокси (концепция)                 │
                    │   14. Когда Spring создаёт прокси        │
                    │   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 Прокси 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 — recommended, но есть исключения
  • 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 (Прокси) → Q14 (Когда создаётся) → Q15 (AOP) → Q16 (Advice/Pointcut)
     ↓                                      ↓
Q17 (@Transactional) → Q18 (Self-invocation) → Q19 (Решения)

Ключевые связи:

  • Q13 ↔ Q14: Прокси — механизм, 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 — recommended, 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, intercepts @Bean calls → singleton. Lite mode = no proxy, each call = new instance
  • AOP: Spring AOP (runtime proxy, methods only) vs AspectJ (compile/load-time weaving, any join point)
  • Autoconfiguration: conditional (@ConditionalOnClass, @ConditionalOnMissingBean), spring.factories → .imports (Boot 2.7+)
  • @Autowired resolution: byType → @Qualifier → @Primary → byName
  • proxyBeanMethods = false: faster startup, but @Bean inter-calls create new instances
  • Transaction propagation: REQUIRED (default), REQUIRES_NEW, NESTED, etc.

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

Каждый файл содержит:

  • 🟢 Junior Level — базовое понимание, простые аналогии, примеры
  • 🟡 Middle Level — внутренности, типичные ошибки, практические примеры
  • 🔴 Senior Level — deep dive, edge cases, production experience, monitoring
  • 🎯 Шпаргалка для интервью — ключевые тезисы, частые вопросы, красные флаги, связанные темы