Предположим, у меня есть класс 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 на уникальную аннотацию темы на приложение)