Как создать "Custom Injection Provider" (фабрика) без трикотажа
Есть ли способ достичь того же результата, описанного здесь, не в зависимости от трикотажа, а в чистом виде? Я хотел бы создать пользовательский поставщик инъекций, например, Джерси, чтобы я мог внедрить MyClass, извлекая пользовательские данные из HttpServletRequest
@Inject
protected MyClass myClass;
Я также нашел это обсуждение полезным, оно работает так же с java.util.function.Supplier
но Джерси все еще нужен в этом коде:
bindFactory(MyFactoryOrSupplier.class)
.to(MyClass.class)
.in(RequestScoped.class);
РЕДАКТИРОВАТЬ:
CDI также является хорошей альтернативой, но предпочтительнее чистый jax-rs
1 ответ
Решение
Я узнаю это решение с помощью CDI:
@ApplicationScoped
public class MyFactoryOrSupplier {
@Produces
@RequestScoped
public IMyClass getMyClass(@Context HttpServletRequest request) {
return (IMyClass) request.getAttribute("MyInjectedClass");
}
}
а потом в моих сервлетах
@Inject
protected IMyClass myClass;
beans.xml
bean-discovery-mode="annotated"
На самом деле MyClass implements IMyClass
потому что я не знаю, что MyClass
иметь публичный конструктор без аргументов, и это сделало свое дело.