Найти все бины с пользовательской аннотацией и создать резольвер из этого бина - PullRequest
0 голосов
/ 25 сентября 2018

У меня есть аннотация:

@Retention(RUNTIME)
public @interface MyHandler {
    MyType type();
}

И у меня есть 3 класса:

@MyHandler(type = MyType.TYPE1)
@Component
public class MyFirstHandler implements MyHandler {

    public MyResponse test() {
        return new MyResponse("first");
    }

}

@MyHandler(type = MyType.TYPE2)
@Component
public class MySecondHandler implements MyHandler {

    public MyResponse test() {
        return new MyResponse("second");
    }

}

@MyHandler(type = MyType.TYPE3)
@Component
public class MyLastHandler implements MyHandler {

    public MyResponse test() {
        return new MyResponse("last");
    }

}

Мне нужно найти все бины с @MyHandler аннотациями и создать resolver из этого бина.После этого мне нужен этот locic:

MyHandler  handler  = resolver.getHandler(MyType.TYPE3)

Как я могу сделать это с пружинной загрузкой?

1 Ответ

0 голосов
/ 25 сентября 2018

Вы можете создать компонент, автоматически подключающий все компоненты типа MyHandler, который затем фильтрует по запросу:

@Component
public class HandlerResolver {
    @Autowired List<MyHandler> handlers;

    public MyHandler getHander(MyType type) {
        handlers.stream()
            .filter(h -> hasAnnotation(type))
            .findFirst()
            .orElseThrow(new IllegalArgumentException("no handler found"));
    }

    private boolean hasAnnotation(MyHandler h, MyType type) {
        MyHandlerAnnotation an = h.class.getAnnotation(MyHandlerAnnotation.class);
        return an != null && an.type() == type);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...