Как среда загрузки Spring определяет, какой bean-компонент подключается автоматически, если есть несколько реализаций указанного интерфейса - PullRequest
0 голосов
/ 16 апреля 2020

Я совершенно новичок в концепции весенней загрузки Io C, и @ Bean

Допустим, этот код реализован

@SpringBootApplication
public class MyApplication{
    @Bean
    public WebClient rest(ReactiveClientRegistrationRepository clients,
                          ServerOAuth2AuthorizedClientRepository authz) {

Вы видите здесь, есть только 1 класс, который реализует интерфейс ReactiveClientRegistrationRepository, поэтому мое правильное предположение состоит в том, что если есть только один класс, который реализует его, то это будет автоматически autowired с параметром clients

public final class InMemoryReactiveClientRegistrationRepository
        implements ReactiveClientRegistrationRepository, Iterable<ClientRegistration> {

Вкл. С другой стороны, ServerOAuth2AuthorizedClientRepository реализуется 3 различными классами, а именно:

public final class AuthenticatedPrincipalServerOAuth2AuthorizedClientRepository
        implements ServerOAuth2AuthorizedClientRepository {


public class UnAuthenticatedServerOAuth2AuthorizedClientRepository implements ServerOAuth2AuthorizedClientRepository {



public final class WebSessionServerOAuth2AuthorizedClientRepository
        implements ServerOAuth2AuthorizedClientRepository {

. При отладке выбирается следующий класс: AuthenticatedPrincipalServerOAuth2AuthorizedClientRepository

. который? Я думаю, что были бы конфликты компонентов, такие как в этом вопросе Spring boot, автоматическое подключение интерфейса с несколькими реализациями

1 Ответ

0 голосов
/ 16 апреля 2020

Причина, по которой ServerOAuth2AuthroizedClientRepostiry является экземпляром AuthenticatedPrincipalServerOAuth2AuthorizedClientRepository, заключается в том, что Spring по умолчанию будет искать bean-компонент, который разрешает тип ServerOAuth2AuthroizedClientRepiository, но если он не существует, будет создан новый объект AuthenticatedPrincipalServerOAuth2AuthorizedClientRepository.

Если вы хотите изменить это, вы можете создать новый Бин с выбранным вами типом.

@Bean
ServerOAuth2AuthroizedClientRepostiry repository() {
    return new WebSessionServerOAuth2AuthorizedClientRepository(...);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...