Наиболее распространенным подходом является использование аннотации @Autowired
. Кроме того, поскольку у вас есть две разные реализации интерфейса Coach
, вы должны использовать аннотацию @Qualifier
, чтобы сообщить Spring, какую реализацию интерфейса следует внедрить.
Некоторые руководства по этим двум аннотациям, чтобы начать работу:
Например, для добавления бобов в вашем контроллере, вы должны сделать:
@RestController
class MyController {
@Autowired
@Qualifier("soccerCoach")
private Coach coach;
@GetMapping("/")
public String sayHello() {
// this should invoke the workout() from SoccerCoach implementation
System.out.println(coach.workout());
return "Time on server is: " + new java.util.Date();
}
}
Или, чтобы вставить soccerCoach
в tennisCoach
, как вы и предполагали, используя инжектор конструктора, код будет выглядеть так:
@Service
class TennisCoach implements Coach {
private Coach soccerCoach;
@Autowired
public TennisCoach(@Qualifier("soccerCoach") Coach soccerCoach) {
this.soccerCoach = soccerCoach;
}
public Coach getCoach() {
System.out.println(soccerCoach.getClass());
return soccerCoach;
}
}
Если вам действительно нужно использовать ApplicationContext
для извлечения какого-либо компонента, не рекомендуется делать это в вашем классе, который имеет функцию main
. Просто создайте другой компонент (вы можете использовать аннотацию @Componenent
). Вот пример:
@Component
public class AnyComponent {
@Autowired
private ApplicationContext applicationContext;
public void invokeCoach() {
System.out.println(applicationContext.getBean("tennisCoach"));
System.out.println(applicationContext.getBean(SoccerCoach.class));
}
}
И внедрить этот bean-компонент в поток приложений, который может находиться в контроллере, службе или репозитории:
@RestController
class MyController {
@Autowired
private AnyComponent anyComponent;
@GetMapping("/")
public String sayHello() {
anyComponent.invokeCoach();
return "Time on server is: " + new java.util.Date();
}
}
Примечание. Инъекция bean-компонентов с помощью аннотаций - это нечто специфицирует c для Spring, в общем, не для Spring Boot в частности.
From https://www.baeldung.com/spring-autowire:
Начиная с Spring 2.5, введена платформа новый стиль внедрения зависимостей, управляемый аннотациями @Autowired. Эта аннотация позволяет Spring разрешать и вводить взаимодействующие bean-компоненты в ваш bean-компонент.