#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 Точка инъекции-это метаобъект, описывающий место, где происходит инъекция. Это автоматически добавляется менеджером контейнеров. Но вы можете просто оставить этот параметр за пределами производителя, если вам не нужна какая-либо из этих сведений.