Autowire компонент, имя которого заканчивается определенным суффиксом - PullRequest
0 голосов
/ 17 октября 2018

Есть ли способ автоматически связать компонент с именем с определенным суффиксом?

Допустим, у меня есть это interface

public interface Foo {
    void bar();
}

, и у меня есть несколько конкретных классов, которыереализовать этот интерфейс

@Component
public class AFooImpl1 implements Foo { ... }

@Component
public class SomeFooImpl1 implements Foo { ... }

@Component
public class OtherFooImpl2 implements Foo { ... }

Теперь я хочу class, который будет автоматически связывать только те конкретные классы, имена которых заканчиваются на "Impl1" внутри List или Set, например, так:

public class Client {
    @Autowired
    private List<Foo> foos;
    ...
}

Как я могу это сделать?

Есть что-то подобное?

public class Client {
    @Autowired
    @Suffix("Impl1")
    private List<Foo> foos;
    ...
}

или это?

public class Client {
    @Autowired
    @Qualifier(suffix("Impl1"))
    private List<Foo> foos;
    ...
}

1 Ответ

0 голосов
/ 17 октября 2018

Я не знаю, возможно ли то, что вы предложили.Что бы я сделал в вашей ситуации:

public class Client {
    private List<Foo> foos;

    @Autowired(required = false)
    public Client(List<Foo> myFoos) {
        this.foos = myFoos.stream()
                .filter(foo -> foo.getClass().getName().endsWith("Impl1"))
                .collect(toList());
    }

    @Autowired(required = false)
    public Client() {
        this.foos = new ArrayList<>();
    }
}

Вы автоматически связываете все экземпляры Foo и фильтруете их.Таким образом, клиент получит только ту сумму, которая ему нужна.

...