Как изменить экземпляр (цель) под прокси CDI (Weld) без воссоздания прокси - PullRequest
0 голосов
/ 24 марта 2019

Я хочу обновить bean-компонент (уничтожить, инициализировать), если изменилось какое-либо свойство, например, соединение db url.Проблема в том, что этот bean-компонент может быть уже внедрен в другие bean-компоненты в контейнере CDI.У меня есть две мысли по этому поводу: 1. Если bean-компонент прокси - уничтожить цель для этого прокси, повторно инициализировать цель внутри этого прокси.2. Для бобов @Singleton и @Dependent, поскольку они не проксированы, я могу обернуть такие бины в прокси и сделать то же самое, что и выше.Причина, по которой я хочу обернуть его в прокси-сервер, заключается в том, что когда свойство изменилось и я хочу воссоздать реальный объект, я должен также знать все зависимые bean-компоненты, которые зависят от моего bean-компонента.Итак, мои вопросы: 1. Как заменить реальный объект внутри прокси в CDI?или 2. Если я не хочу сохранять прокси, как я объяснил выше, как создать прокси-объект для моего компонента и повторно внедрить его во все зависимые компоненты в контейнере CDI?

Это мой предыдущий вопрос: Повторно внедрить bean-компонент CDI, если какое-то введенное свойство изменилось

Снова, я использую CDI (Weld), а не Spring IoC, поэтому я не могу использовать @RefreshScope из конфигурации Spring Cloud, но я думаю, что мойожидаемая функциональность может быть аналогичной с использованием пользовательской области

1 Ответ

0 голосов
/ 30 марта 2019

Для бинов @DependedSCoped вы можете использовать класс MyBean {

   @Inject
   private Instance<MYType> myTypeInst;

   // This will ensure, that the bean is always fresh created.
   // But the property value on the former instance will be lost
   // So the changable value has to be provided another way to the created bean
   public void do SomeThing(){
      MyType bean = myTypeInst.get();

      myTypeInst.destroy(bean);
   }
}

Если вы используете бин @Depended scoped, то вы должны знать, что целевой объект инъекции получает свой экземпляр, который предназначен исключительно для этого бина,так кто меняет значение?Является ли область @Dependend правильной областью для вашего варианта использования?

Нет необходимости предоставлять собственный прокси или взломать существующий, просто найдите подходящую область для вашего варианта использования и правильно реализуйте компонент.Если URL-адрес соединения может измениться, то bean-компонент, управляющий соединением, должен знать об этом изменении и воссоздавать соединение, и бины, использующие этот bean-компонент, должны извлекать соединение каждый раз, когда его используют.

Возможно, вы могли бы дать описание вашего варианта использования, тогда мы, возможно, сможем дать вам лучший ответ.

Заключение

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

...