2013-12-20 5 views
5

Я разрабатываю API REST с использованием Jersey 2, и мне нужно, чтобы некоторые из моих классов были созданы при запуске, а не только когда запускается какой-то запрос ресурса.Что соответствует asEagerSingleton в HK2 в Джерси 2?

Так что я спрашиваю: как достичь того, что приведенный ниже пример SomethingImpl создан при запуске сервера, а не только когда кто-то попадает на что-то ресурс? В Guice я бы использовал .asEagerSingleton().

Применение:

public class MyApplication extends ResourceConfig { 
    public MyApplication() { 
     register(new AbstractBinder() { 
      @Override 
      protected void configure() { 
       bind(" else").to(String.class); 
       bind(SomethingImpl.class).to(Something.class).in(Singleton.class); 
      } 
     }); 

     register(SomeResource.class); 
    } 
} 

Что-то:

public interface Something { 
    String something(); 
} 

public class SomethingImpl implements Something { 
    @Inject 
    public SomethingImpl(final String something) { 
     new Thread(new Runnable() { 
      @Override 
      public void run() { 
       while (true) { 
        System.out.println(something() + something); 

        try { 
         Thread.sleep(4000); 

        } catch (final InterruptedException e) { 
         break; 
        } 
       } 
      } 
     }).start(); 
    } 

    @Override 
    public String something() { 
     return "Something"; 
    } 
} 

Некоторые ресурс:

@Path("/") 
public class SomeResource { 
    private final Something something; 

    @Inject 
    public SomeResource(final Something something) { 
     this.something = something; 
    } 

    @GET 
    @Path("something") 
    public String something() { 
     return something.something(); 
    } 
} 
+0

не можете просто создать и привязать экземпляр 'SomethingImpl' вместо привязки тип класса? – Kapep

+0

В этом упрощенном коде да. Но в моем реальном коде классы, которые мне нужны, имеют конструкторы, которые берут несколько инъецируемых объектов. – Stine

ответ

5

В более поздних версиях HK2 чем интегрирован Джерси (но которые будут интегрированы в ближайшее время) вы можете получать услуги, которые отмечены @Immediate. Они начинаются, как только они добавляются в hk2. Однако для того, чтобы заставить его работать, вам нужно будет добавить контекст в систему (например, https://hk2.java.net/2.2.0-b27/apidocs/org/glassfish/hk2/utilities/ServiceLocatorUtilities.html#enableImmediateScope%28org.glassfish.hk2.api.ServiceLocator%29)

Было бы неплохо лоббировать команду Джерси, чтобы включить эту область/контекстную пару по умолчанию (они уже позволяют такие вещи, как объем PerThread)

Я создал этот вопрос: https://java.net/jira/browse/JERSEY-2291 просить Джерси включить @Immediate услуги по умолчанию

+0

Звучит многообещающе :) Но как я могу назвать 'ServiceLocatorUtilities.enableImmediateScope', когда он не поддерживается HK2, включенным в Джерси? – Stine

+1

Я не думаю, что ты можешь. Вам придется подождать версию Джерси с достаточно высокой версией hk2. Я считаю, что это произойдет очень скоро в новом году, так что вам, возможно, придется подождать до тех пор – jwells131313

+0

Мысль так;) Спасибо, что поделились своими знаниями о '@ Immediate'. Я сейчас откажусь и просто создам нужные мне объекты при запуске вручную. – Stine

0

Напишите реализацию javax.servlet.ServletContextListener и добавить, что слушатель в веб-XML ,

http://www.mkyong.com/servlet/what-is-listener-servletcontextlistener-example/

+0

Но в моем слушателе контекста сервлета я не могу вводить объекты? – Stine

+0

В моей работе мы используем весну с нашими слушателями контекста сервлета, и она определенно вводит зависимости в слушателя. Я думаю, что это работает до тех пор, пока прослушиватель контекста весны сервлетов будет указан перед вашим слушателем, но я не совсем уверен в этом. Конечно, вам также нужно будет определить слушателя в качестве весеннего компонента в контексте вашего приложения. – msknapp

+0

Я бы предпочел не смешивать несколько каркасов инъекций зависимостей. Может быть, я должен просто отказаться от HK2 и вместо этого переключиться на Guice или Spring. На этом этапе это немного раздражает;) – Stine

0

Кроме того, что msknapp сказал, вы можете также использовать @WebListener для контекста сервлета слушателя, так что вам не нужно, чтобы добавить слушателя web.xml. Тогда ваш слушатель будет выглядеть

@WebListener 
public class SomethingListener implements ServletContextListener { 
    @Inject 
    private final Something something; 

    @Override 
    public void contextInitialized(ServletContextEvent sce) { 
     //put code about something here 
    } 
} 
+0

Когда я это делаю, что-то не вводится? – Stine

+0

Я использую Spring как основу для инъекций зависимостей с Джерси. Раньше я не использовал HK2. Я бы посоветовал не испортить другие рамки, если вы уже используете Spring.Пример Джерси с весной можно найти здесь (https://github.com/jersey/jersey/tree/2.4.1/examples/helloworld-spring-webapp). – tonga

+0

Я не использую Spring ... по крайней мере, не то, что я знаю: D – Stine

Смежные вопросы