инъекция java CDI как аннотировать и изменять класс третьей части

#java #dependency-injection #cdi

Вопрос:

Я новичок в java CDI, мне интересно, как я могу аннотировать сторонний класс, когда я его вводлю.

Например, я хотел бы внедрить джексона ObjectMapper во многие мои сервисы, и я хотел бы зарегистрировать какой-нибудь индивидуальный сериализатор, что я могу сделать, это написать метод и отметить как @PostConstruct , но только когда я смогу получить доступ к его коду. Я думаю, что этот сценарий довольно распространен при введении какого-либо третьего класса деталей, но хотел бы сделать некоторые настройки для них. Какова распространенная практика в java CDI?

Ответ №1:

Напишите продюсеру.

Я часто использую это для создания подобных регистраторов:

 @ApplicationScoped
public class LoggerProducer {
   @Produces
   public Logger getLogger(InjectionPoint ip) {
      // only include the injection point if you need it
      return LoggerFactory.getLogger(ip.getBean().getBeanClass().getSimpleName());
   }
}

...

@Inject
private Logger logger;
 

Комментарии:

1. в приведенном выше примере, как менеджер контейнера узнал, какой ip параметр нужно передать? Должны ли мы также указать значение параметра в том месте, где мы его вводим?

2. @ZiqiLiu Точка инъекции-это метаобъект, описывающий место, где происходит инъекция. Это автоматически добавляется менеджером контейнеров. Но вы можете просто оставить этот параметр за пределами производителя, если вам не нужна какая-либо из этих сведений.