Сначала просто ответьте на комментарий в ответе accept.
«Что делает привязка? Что делать, если у меня есть интерфейс и реализация?»
blockquote>Он просто читает
bind( implementation ).to( contract )
. Вы можете использовать альтернативную цепочку.in( scope )
. Область по умолчаниюPerLookup
. Поэтому, если вам нужен синглтон, вы можетеbind( implementation ).to( contract ).in( Singleton.class );
Также имеется
RequestScoped
Кроме того, вместо
bind(Class).to(Class)
вы также можетеbind(Instance).to(Class)
, который будет быть автоматически одиночным.
Для тех, кто пытается выяснить, как зарегистрировать реализацию
AbstractBinder
в ваш web.xml (т. е. вы не используетеResourceConfig
), похоже, связывание не будет обнаружено через сканирование пакетов, то есть
org.glassfish.jersey.servlet.ServletContainer jersey.config.server.provider.packages your.packages.to.scan Или это либо
jersey.config.server.provider.classnames com.foo.YourBinderImpl Чтобы заставить его работать, мне пришлось реализовать
Feature
:import javax.ws.rs.core.Feature; import javax.ws.rs.core.FeatureContext; import javax.ws.rs.ext.Provider; @Provider public class Hk2Feature implements Feature { @Override public boolean configure(FeatureContext context) { context.register(new AppBinder()); return true; } }
Аннотации
@Provider
должны позволять выбиратьFeature
путем сканирования пакета. Или без сканирования пакетов вы можете явно зарегистрироватьFeature
вweb.xml
Jersey Web Application org.glassfish.jersey.servlet.ServletContainer ... jersey.config.server.provider.classnames com.foo.Hk2Feature 1 См. Также:
- Пользовательский параметр метода [gg]
- Как правильно настроить EntityManager в jersey / hk2
- Запросить выделенную инъекцию в синглтоны
и для общей информации из документации Джерси
UPDATE
Заводы
от базовой привязки в принятом ответе, у вас также есть заводы, где вы можете иметь более сложную логику создания, а также иметь доступ к информации контекста запроса. Например
public class MyServiceFactory implements Factory
{ @Context private HttpHeaders headers; @Override public MyService provide() { return new MyService(headers.getHeaderString("X-Header")); } @Override public void dispose(MyService service) { /* noop */ } } register(new AbstractBinder() { @Override public void configure() { bindFactory(MyServiceFactory.class).to(MyService.class) .in(RequestScoped.class); } }); Затем вы можете ввести
MyService
в свой класс ресурсов.