Spring Spring Boot
29 вопросов и ответов в разделе Spring Spring Boot.
Вопросы этого раздела
- Что такое Dependency Injection?
- В чём разница между constructor, setter и field injection?
- Какой тип injection рекомендуется использовать и почему?
- Что такое Bean в Spring?
- Как создать Bean в Spring?
- Что такое Bean Lifecycle?
- Какие этапы жизненного цикла Bean?
- Что такое BeanPostProcessor?
- Что делают методы с аннотацией @PostConstruct и @PreDestroy?
- Что такое scope Bean?
- Какие scope существуют в Spring?
- В чём разница между singleton и prototype scope?
- Что такое прокси в Spring?
- Когда Spring создаёт прокси?
- Что такое AOP (Aspect-Oriented Programming)?
- Что такое аспект, advice, pointcut, join point?
- Что делает аннотация @Transactional?
- Почему @Transactional не работает при self-invocation?
- Как решить проблему с self-invocation?
- Что такое автоконфигурация в Spring Boot?
- Как работает @SpringBootApplication?
- Что такое starter в 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. Прокси (концепция) │
│ 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
- 🎯 Шпаргалка для интервью — ключевые тезисы, частые вопросы, красные флаги, связанные темы