Scoping Bean без аннотации - PullRequest
       10

Scoping Bean без аннотации

1 голос
/ 04 октября 2019

Предположим, у меня есть класс RecordSender, конструктор которого принимает целевое имя. Для CDI-ify этого класса я мог бы написать производителя, подобного этому, который проверяет точку внедрения, чтобы найти аннотацию с именем Topic (не Qualifier, поскольку метод источника не может быть аннотирован всеми возможными значениями названий тем, которые он мог быпроизводить):

@Produces
public RecordSender getRecordSender(InjectionPoint injectionPoint) {
    return new RecordSender(injectionPoint.getAnnotated().getAnnotation(Topic.class).value());
}

Но предположим, что этот класс RecordSender довольно тяжелый, но потокобезопасный, и поэтому должен использоваться как можно больше. Это означает, что я хочу, чтобы любые сайты внедрения, которые выглядели как @Inject @Topic("FooBar") RecordSender fooBarSender, имели общий экземпляр RecordSender, созданный с именем FooBar.

Мы не можем пометить метод источника как ApplicationScoped, так как RecordSenders можетбыть разделенным только между точками инъекции с тем же именем. Мы не можем сделать @Topic квалификатором, так как метод источника не будет аннотирован этим классификатором. Каков подход CDI к этой проблеме?

Мое видение будет аннотацией, которая необязательно сопровождает аннотацию области видимости, может быть, ScopedTo, чей параметр является классом аннотации без квалификатора, который будет вызывать разделение области видимости для бинов, которые онианнотировать. Так, например, @ApplicationScoped @ScopedTo(Topic.class) в методе продюсера будет ответом на мой вопрос (по одному RecordSender на уникальную аннотацию темы на приложение)

Ответы [ 2 ]

0 голосов
/ 23 октября 2019

Наилучшим подходом, вероятно, было бы пойти по пути расширения.

Однако, другой более простой подход мог бы заключаться в том, чтобы производитель был в бине области применения. Этот bean-компонент может содержать некоторый кэш (карта со слабыми значениями может выполнять эту работу). Таким образом, если он уже существует для данного типа, вы можете вернуть кэшированную версию, в противном случае создайте новый объект и кеш, прежде чем возвращаться от производителя. Ключ может быть извлечен из аннотации вашей темы. Если это квалификатор, атрибут темы может быть помечен как необязательный.

0 голосов
/ 11 октября 2019

Другой подход заключается в написании переносимого расширения, которое сканирует и классифицирует соответствующие точки внедрения, а затем, в методе наблюдателя, который наблюдает за AfterBeanDiscovery событиями, программно добавляет компоненты в области действия ApplicationScoped для каждогосоответствующая категория точки впрыска. Тогда нет необходимости в динамическом выделении InjectionPoint, которое вам нужно сделать в методе продюсера.

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