... если экземпляр нужно создать вручную, возможно, сторонним классом factory? Раньше (Jersey 1.x) вы делали бы что-то вроде этого:
public class MyInjectableProvider extends PerRequestTypeInjectableProvider<Context, MyInjectable> {
public MyInjectableProvider() {
super(MyInjectable.class);
}
@Override
public Injectable<MyInjectable> getInjectable(ComponentContext ic, Context context) {
MyInjectable myInjectableInstance = //...
return new Injectable<MyInjectable>() {
@Override
public MyInjectable getValue() {
return myInjectableInstance;
}
};
}
}
Анонимный локальный класс может получить доступ к экземпляру для возврата в пределах некоторой области. Это полезно, если вы не работаете с классами, у которых есть конструкторы по умолчанию, но они должны быть построены по запросу.
Джерси 2.0 переключился на HK2 как инфраструктуру внедрения зависимостей, но, увы, страница миграции (https://jersey.java.net/documentation/latest/migration.html) не является примером такого типа а документация HK2 не содержит примеров с использованием AbstractBinder.
Чтобы разработать немного больше, я пытаюсь предоставить ресурсные локальные, контейнер-агностические экземпляры JPA EntityManager для моих ресурсов. Они должны извлекаться из класса singleton factory и должны придерживаться только одного "единицы работы", который является запросом в моем случае. Я знаю, что есть обходные пути (просто введите factory или привяжите к threadlocal), но я нашел предыдущее решение элегантным и хотел бы его воссоздать, если это возможно.
EDIT:
После того, как я немного разобрался с хакадоками HK2, я обнаружил, что что-то подобное может быть достигнуто следующим образом:
public class MyInjectableProvider extends AbstractBinder
implements Factory<MyInjectable> {
@Override
protected void configure() {
bindFactory(this).to(MyInjectable.class);
}
@Override
public MyInjectable provide() {
return getMyInjectable();
}
@Override
public void dispose(MyInjectable instance) {}
}
И зарегистрировать его...
public class MyResourceConfig extends ResourceConfig {
public MyResourceConfig() {
register(new MyInjectableProvider());
}
}
Это "похоже, работает", но это также кажется немного неясным. Например, dispose() никогда не вызывается. Кроме того, эта привязка, по-видимому, неявно ведет себя как RequestScoped. Изменение конфигурации на bindFactory(this).to(MyInjectable.class).in(RequestScoped.class);
не влияет на поведение. Я что-то упустил, или это намеченное решение?