1. IoC (Inversion of Control — инверсия управления)
Идея:
Не ты создаёшь объекты вручную (new), а контейнер Spring управляет их созданием и связыванием.
👉 В обычном Java:
class Car {
private Engine engine = new Engine(); // жёсткая связка
}👉 В Spring (через DI):
@Component
class Engine {}
@Component
class Car {
private final Engine engine;
@Autowired
Car(Engine engine) { this.engine = engine; }
}⚡ Теперь Engine и Car создаёт контейнер Spring.
2. DI (Dependency Injection — внедрение зависимостей)
Виды DI:
- Через конструктор (лучший способ)
@Component
class UserService {
private final UserRepository repo;
@Autowired
UserService(UserRepository repo) { this.repo = repo; }
}- Через поле (антипаттерн, но встречается)
@Component
class UserService {
@Autowired
private UserRepository repo;
}- Через сеттер
@Component
class UserService {
private UserRepository repo;
@Autowired
public void setRepo(UserRepository repo) {
this.repo = repo;
}
}3. Бины (Beans)
Bean = объект, управляемый Spring.
👉 Создание бина:
@Component
class MyService {}👉 Альтернатива (Java Config):
@Configuration
class AppConfig {
@Bean
public MyService myService() {
return new MyService();
}
}4. ApplicationContext
Spring хранит все бины в ApplicationContext (контейнер). Пример запуска без Spring Boot:
AnnotationConfigApplicationContext ctx =
new AnnotationConfigApplicationContext(AppConfig.class);
MyService service = ctx.getBean(MyService.class);
service.doWork();В Spring Boot это происходит автоматически.
5. Жизненный цикл бина
- Создание объекта
- Внедрение зависимостей
- Вызов @PostConstruct
- Использование
- Уничтожение (вызов @PreDestroy)
@Component
class MyBean {
@PostConstruct
public void init() {
System.out.println("Bean initialized");
}
@PreDestroy
public void cleanup() {
System.out.println("Bean destroyed");
}
}6. Scope (области жизни бина)
- singleton (по умолчанию) → один объект на приложение
- prototype → новый объект при каждом запросе
- request (Web) → один объект на HTTP-запрос
- session (Web) → один объект на сессию
@Component
@Scope("prototype")
class PrototypeBean {}7. Аннотации Spring Core
| Аннотация | Что делает |
|---|---|
| @Component | бин-компонент |
| @Service | бизнес-логика |
| @Repository | DAO-слой (автоматический @Transactional) |
| @Controller | MVC-контроллер |
| @RestController | контроллер с @ResponseBody |
| @Configuration | конфигурационный класс |
| @Bean | бин внутри @Configuration |
| @Autowired | внедрение зависимостей |
| @Qualifier | уточнение бина, если несколько |
| @Value | внедрение значений из application.properties |
8. Конфигурации (Java, XML, Аннотации)
Сегодня почти всегда используют Java Config и аннотации.
@Configuration
class MyConfig {
@Bean
public Engine engine() {
return new Engine();
}
}9. Profiles (разные окружения)
application.properties:
spring.profiles.active=devОпределение бина для конкретного профиля:
@Component
@Profile("dev")
class DevDatabaseConfig {}10. Best Practices
- ✅ Используй внедрение через конструктор → удобнее тестировать, меньше проблем с null.
- ✅Делай классы @Service → для бизнес-логики, @Repository → для работы с БД.
- ✅ Не используй @Autowired на полях (только на конструкторе).
- ✅ Контролируй scope → по умолчанию лучше singleton.
- ✅ Используй @Configuration и @Bean для сложных зависимостей.