Как включить пружину для ввода правильного bean-компонента при использовании генериков в таком случае? - PullRequest
1 голос
/ 13 июня 2019

У меня есть следующий тест:

@SpringJUnitConfig(SpringContextTest.Foo.class)
public class SpringContextTest {

    @Autowired
    private Predicate<Double> predicate;

    @Configuration
    public static class Foo {

        @Bean
        @Scope("prototype")
        public <T extends Number> Predicate<T> numberPredicate() {
            return t -> true;
        }

        @Bean
        @Scope("prototype")
        public <T extends CharSequence> Predicate<T> charSequencePredicate() {
            return t -> true;
        }
    }

    @Test
    public void foo() {
    }
}

Я хотел бы добавить экземпляр компонента numberPredicate в SpringContextTest.predicate. Однако проверка как таковая приводит к ошибке:

org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying 
bean of type 'java.util.function.Predicate<java.lang.Double>' available: expected 
single matching bean but found 2: numberPredicate,charSequencePredicate

Причиной использования параметра типа в методе @Bean и @Scope("prototype") было то, что я думал, что тогда Spring сможет создавать экземпляры различных бинов и регистрировать их соответствующим образом в зависимости от параметра типа, используемого в поле, которое нужно вставить. .

Я знаю, что описанный выше тест работает, если я заменил объявление predicate на

    @Autowired
    private Predicate<? super Double> predicate;

Но это налагает бремя на клиентов, использующих боб, и поэтому я хотел бы избежать этого.

Я также хотел бы избежать использования @Qualifier("numberPredicate"), чтобы не зависеть от имен бинов.

Так есть ли способ вставить правильный бин в поле predicate?

1 Ответ

0 голосов
/ 13 июня 2019

Подстановочный шаблон или @Qualifier подойдет для такого сценария, однако, поскольку вы заявили, что предпочитаете не полагаться на имена бинов, вы можете использовать аннотацию @Primary для указания предпочитаемого бина или autowire список всех кандидатов на автопроводку, используя

@Autowired
private List<Predicate<Double>> predicate;

и вручную выберите компонент, который вы предпочитаете, в конструкторе класса или в методе @PostConstruct.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...