2016-09-07 4 views
1

Я пытаюсь понять, как развивается разработка 2-го и контекстно-зависимого инъекций.Jersy2 injection slf4j Logger

Я не понимаю, как вводить в ресурс объект, которому требуются параметры инициализации в конструкторе. Например: Я хочу, чтобы @Inject slf4j Logger, построенный с использованием LoggerFactory.

Мой класс ресурс:

@Path("/myresource") 
public class MyResource { 
    @Inject 
    private Logger log; 

    @GET 
    @Produces(MediaType.APPLICATION_JSON) 
    public Answer status() { 
     log.info("STATUS"); 
     return new Answer(200, "Server up and running @ "+ ZonedDateTime.now()); 
    } 
} 

Мой конфиг Ресурс:

public class MyAppextends ResourceConfig { 
    public MyApp() { 
     register(new MyBinder()); 
     packages(true, "my.packages"); 
    } 
} 

public class MyBinder extends AbstractBinder { 

    @Override 
    protected void configure() { 
     bindFactory(MyLoggerFactory.class).to(org.slf4j.Logger.class); 
    } 
} 

Наконец, фабрика:

public class MyLoggerFactory implements Factory<Logger> { 

    @Override 
    public Logger provide() { 
     return LoggerFactory.getLogger(TYPE_FOR_LOGGING.class); 
    } 

    @Override 
    public void dispose(Logger logger) { 

    } 
} 

Как я могу указать TYPE_FOR_LOGGING в качестве аргумента, в чтобы ввести правильно инициализированный Logger в каждый ресурс, который я хочу?

Благодаря

ответ

2

Что вы ищете называется InstantiationService. Вы можете ввести его в Фабрики, чтобы узнать, кто вызывает фабрику внутри метода обеспечения.

Ниже приведен пример кода из тестов hk2, которые иллюстрируют использование службы InstantiationService.

@Singleton 
public class CorrelationFactory implements Factory<PerLookupServiceWithName> { 
    private final static PerLookupServiceWithName NULL_SERVICE = new PerLookupServiceWithName() { 

     @Override 
     public String getName() { 
      return null; 
     } 

    }; 

    @Inject 
    private InstantiationService instantiationService; 

    /* (non-Javadoc) 
    * @see org.glassfish.hk2.api.Factory#provide() 
    */ 
    @Override @PerLookup 
    public PerLookupServiceWithName provide() { 
     InstantiationData data = instantiationService.getInstantiationData(); 
     if (data == null) { 
      return NULL_SERVICE; 
     } 

     Injectee parent = data.getParentInjectee(); 

     if (parent == null) { 
      return NULL_SERVICE; 
     } 

     Class<?> parentClass = parent.getInjecteeClass(); 
     if (parentClass == null) { 
      return NULL_SERVICE; 
     } 

     Correlator correlator = parentClass.getAnnotation(Correlator.class); 
     if (correlator == null) { 
      return NULL_SERVICE; 
     } 

     final String fName = correlator.value(); 

     return new PerLookupServiceWithName() { 

      @Override 
      public String getName() { 
       return fName; 
      } 

     }; 
    } 

    /* (non-Javadoc) 
    * @see org.glassfish.hk2.api.Factory#dispose(java.lang.Object) 
    */ 
    @Override 
    public void dispose(PerLookupServiceWithName instance) { 
     // DO nothing 
    } 

} 
+0

Спасибо, это именно то, что мне нужно. Не могли бы вы указать некоторую документацию HK2, отличную от JavaDoc? – besil

+0

Единственная другая документация, которую я могу найти о InstantiationService, находится на фабрике javadoc. Вероятно, это должно быть исправлено, вероятно, потребуется немного больше объяснений, чем то, что содержится в текущей документации – jwells131313

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

  • Нет связанных вопросов^_^