Спросят с вероятностью 12%
Внедрение зависимостей (Dependency Injection, DI) — это ключевой принцип в разработке ПО, позволяющий уменьшить связность между компонентами программы и упростить их тестирование. DI может быть реализовано различными способами, в зависимости от используемых технологий и фреймворков. Существуют следующие основные способы внедрения зависимостей:
1️⃣Внедрение через конструктор (Constructor Injection)
Это предпочтительный способ внедрения зависимостей, при котором все необходимые зависимости передаются через конструктор класса. Это обеспечивает неизменяемость объекта после его создания и гарантирует, что объект всегда находится в валидном состоянии.
@Component
public class MyService {
private final Dependency dependency;
@Autowired
public MyService(Dependency dependency) {
this.dependency = dependency;
}
}
2️⃣Внедрение через сеттер (Setter Injection)
При таком подходе зависимости внедряются через сеттеры после создания объекта. Это может быть полезно, если у класса есть опциональные зависимости или если требуется переконфигурация объекта после его создания.
@Component
public class MyService {
private Dependency dependency;
@Autowired
public void setDependency(Dependency dependency) {
this.dependency = dependency;
}
}
3️⃣Внедрение через поля (Field Injection)
Непосредственно в поля класса без использования сеттеров или конструктора. Хотя это удобно и уменьшает количество кода, такой подход может затруднить тестирование и не гарантирует завершённость состояния объекта после его создания.
@Component
public class MyService {
@Autowired
private Dependency dependency;
}
4️⃣Внедрение через методы (Method Injection)
Зависимости внедряются через произвольные методы, не являющиеся сеттерами. Spring вызовет эти методы сразу после создания бина, передавая необходимые зависимости в качестве аргументов.
@Component
public class MyService {
private Dependency dependency;
@Autowired
public void initialize(Dependency dependency) {
this.dependency = dependency;
}
}
Выбор способа внедрения зависимостей во многом зависит от конкретных требований к проекту и предпочтений разработчика. Внедрение через конструктор обычно считается наиболее безопасным и предпочтительным способом, поскольку оно обеспечивает неизменяемость и гарантирует, что объект будет полностью сконфигурирован при создании. Однако, в некоторых случаях другие способы могут быть более удобными или подходящими.
➡️Примеры ответов
➡️ Список всех вопросов на Java Developer
🧩 Идущий | 🔐 Собесы | 🔐 Тестовые