Почему Spring отклоняет @Qualifier для bean-объекта в области запросов с прокси-режимом INTERFACES? - PullRequest
1 голос
/ 10 октября 2019

Мой интерфейс:

public interface SomeInterface {}

реализован с помощью bean-объекта в области запросов:

@Component
@Qualifier("q")
@Scope(value = WebApplicationContext.SCOPE_REQUEST,
       proxyMode = ScopedProxyMode.INTERFACES)
public class Implementation implements SomeInterface { }

С учетом рекомендаций типа ИНТЕРФЕЙСЫ или TARGET_CLASS: какой прокси-режим следует использоватьвыберите? предполагает, что режим прокси INTERFACES должен соответствовать этой довольно чистой настройке.

Поскольку я хочу закончить несколькими альтернативными реализациями SomeInterface, я добавляю дополнительный @Qualifier("q").

Однако Spring полностью отклоняет классификатор, ведя себя так, как будто не было подходящего @Component.

Например, следующий тест завершается неудачно с типичным UnsatisfiedDependencyException высказыванием Spring "ожидал по крайней мере 1 бин, который считается кандидатом autowire ", но не нашел ни одного для @org.springframework.beans.factory.annotation.Qualifier(value=q).

@RunWith(SpringRunner.class)
@SpringBootTest(classes = {SomeInterface.class, Implementation.class})
public class AutowiringTest {

    @Autowired
    @Qualifier("q")
    private SomeInterface cut;

    @Test
    public void autowires() {
        assertThat(cut).isInstanceOf(SomeInterface.class);
    }

}

Напротив, выбор стандартного имени бина заставляет вещь работать:

@Autowired
@Qualifier("implementation")
private SomeInterface cut; // <-- works

Кроме того, изменение имени стандартного компонента вместо добавления @Qualifier делает работу вещи:

@Component("q")
@Scope(value = WebApplicationContext.SCOPE_REQUEST, 
       proxyMode = ScopedProxyMode.INTERFACES)
public class Implementation implements SomeInterface { }

Кроме того, изменение режима прокси на TARGET_CLASS делает работу вещи:

@Component("q")
@Scope(value = WebApplicationContext.SCOPE_REQUEST, 
       proxyMode = ScopedProxyMode.TARGET_CLASS)
public class Implementation implements SomeInterface { }

Что такого особенногов режиме прокси INTERFACES, который не будет работать в сочетании с @Qualifier?

...