Я пытаюсь изменить наше существующее расширение CDI, которое создает свои собственные прокси-компоненты. Теперь для каждой службы создается только один прокси. Службы имеют что-то вроде области приложения, поэтому всегда существует только один экземпляр службы.
Чего я хочу добиться, так это создать один прокси-компонент для каждой точки внедрения. Мне они нужны, чтобы хранить некоторую информацию, специфичную для данной точки впрыска. Если для одной и той же службы имеется больше точек внедрения, будет больше прокси-компонентов, но за ними будет стоять один экземпляр службы. Однако, когда я изменяю поведение таким образом, Weld жалуется на неоднозначные зависимости, поскольку не может выбирать между двумя абсолютно одинаковыми прокси.
Как я могу это исправить? По сути, я наблюдаю за событием ProcessBean
и создаю новый прокси для каждой точки внедрения каждого отдельного обнаруженного компонента. Затем я добавляю все эти прокси-бины в контейнер, используя метод AfterBeanDiscovery#addBean
. Мне как-то нужно было бы пропустить этот последний шаг и ввести их вручную в их точки инъекции или иметь возможность влиять на решение о выборе правильного компонента для инъекции. Если мне дадут точку внедрения и список неоднозначных зависимостей, которые можно в нее внедрить, я смогу выбрать правильную на основе ее атрибута. Но я действительно не знаю, возможно ли принять это решение для Weld и как я могу это сделать.
EDIT: я просто хочу реализовать свою собственную область видимости, аналогичную @Dependent
, но с прокси-серверами, в которых я могу хранить некоторую дополнительную информацию, связанную с данной точкой внедрения.
EDIT2: я, наконец, исправил это, создав новый квалификатор, содержащий информацию о конкретной точке инъекции. Этот квалификатор добавляется как к точке внедрения, так и к ее прокси. Но это не очень хорошее решение, так как мне приходится заменять точки внедрения собственной реализацией, которая позволяет модифицировать коллекцию квалификаторов. Я чувствую, что должно быть более элегантное решение. Пожалуйста, дайте мне знать, если вы можете что-нибудь придумать.