Мой интерфейс:
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
?