@lilla.herman
В Spring полиморфизм можно использовать следующими способами:
- Внедрение зависимостей через интерфейсы: Создайте интерфейс и несколько реализаций этого интерфейса. Затем используйте аннотацию @Autowired для автоматической инъекции зависимости на основе типа интерфейса.
public interface MyService {
void doSomething();
}
@Service
public class MyServiceImplA implements MyService {
public void doSomething() {
// реализация для A
}
}
@Service
public class MyServiceImplB implements MyService {
public void doSomething() {
// реализация для B
}
}
@Controller
public class MyController {
private final MyService service;
@Autowired
public MyController(MyService service) {
this.service = service;
}
// работа с сервисом
}
Если несколько реализаций интерфейса, Spring выберет подходящего по типу или аннотации (@Primary, @Qualifier) бина.
- Использование абстрактного класса: Создайте абстрактный класс и несколько его наследников. Определите методы с общей логикой в абстрактном классе, а специфическую логику в наследниках.
public abstract class MyBaseService {
public void commonMethod() {
// общая логика
}
public abstract void doSomething();
}
@Service
public class MyServiceImplA extends MyBaseService {
public void doSomething() {
// реализация для A
}
}
@Service
public class MyServiceImplB extends MyBaseService {
public void doSomething() {
// реализация для B
}
}
@Controller
public class MyController {
private final MyBaseService service;
@Autowired
public MyController(MyBaseService service) {
this.service = service;
}
// работа с сервисом
}
Выбирается конкретный наследник абстрактного класса на основе типа или аннотации бина.
Это два базовых способа использования полиморфизма в Spring. В обоих случаях вы можете менять реализацию сервиса, не затрагивая код потребителей.