Как правильно использовать внедрение зависимостей в приложении Spring Boot?
Мое программное обеспечение имеет главное окно JavaFX и несколько вложенных диалоговых окон, которые открываются и закрыто из главного окна. Мне нужно использовать клиенты REST в поддиалогах, которые внедряются Spring Boot. Однако для инициализации каждого экземпляра клиента требуется параметр конструктора.
В итоге я получаю множество REST-клиентов в контроллере моего главного окна, которые затем передаются контроллерам подчиненного окна. диалоги. Есть ли лучший способ реализовать это, чтобы избавиться от всех параметров конструктора?
@Component
@Scope("prototype")
public class MainController {
private final FirstClient first;
private final SecondClient second;
private final ThirdClient third;
@Autowired
public MainController(FirstClient first, SecondClient second, ThirdClient third) {
this.first = first;
this.second = second;
this.third = third;
}
private void openSubDialog() {
// ...
SubController subController = new SubController(first, second);
// ...
}
private void openAnotherSubDialog() {
// ...
AnotherSubController anotherSubController = new AnotherSubController(first, third);
// ...
}
}
Мои классы контроллеров помечены @Component и @Scope("prototype").
@Component
@Scope("prototype")
public class SubController {
private final FirstClient first;
private final SecondClient second;
@Autowired
public SubController(FirstClient first, SecondClient second) {
this.first = first;
this.second = second;
}
private void doSomething() {
var result = first.callSomeService();
}
}
И, наконец, мои REST-клиенты выглядят примерно так:
@Service
public class FirstClient {
public SomeType callSomeService() {
return restClient.getSomeData();
}
}
Я ищу способ напрямую внедрить клиентов REST в контроллеры поддиалогов без необходимости добавлять параметры конструктора и передавать их. вниз от основного вида. В псевдокоде примерно так:
@Component
@Scope("prototype")
public class ImprovedController {
@InjectHereDirectly
private final FirstClient first;
@InjectHereDirectly
private final SecondClient second;
// No constructor needed
private void doSomething() {
var result = first.callSomeService();
}
}
Подробнее здесь: https://stackoverflow.com/questions/783 ... pring-boot