RU | EN | DE

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:

  1. Через конструктор (лучший способ)
@Component
class UserService {
    private final UserRepository repo;
    @Autowired
    UserService(UserRepository repo) { this.repo = repo; }
}
  1. Через поле (антипаттерн, но встречается)
@Component
class UserService {
    @Autowired
    private UserRepository repo;
}
  1. Через сеттер
@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. Жизненный цикл бина

  1. Создание объекта
  2. Внедрение зависимостей
  3. Вызов @PostConstruct
  4. Использование
  5. Уничтожение (вызов @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бизнес-логика
@RepositoryDAO-слой (автоматический @Transactional)
@ControllerMVC-контроллер
@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 для сложных зависимостей.