2013-02-12 6 views
1

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

Мой привязывать код

binder.bind(ProcessorFactory.class).asEagerSingleton(); 

код я привязки (и я хочу, чтобы заполнить Guice в SplineProcessor и InvertProcessor с их креплениями по созданию

public class ProcessorFactory implements Provider<Processor>{ 

    public static final ThreadLocal<String> threadLocal = new ThreadLocal<String>(); 

    private Map<String, Class<?>> nameToClazz = new HashMap<String, Class<?>>(); 

    public ProcessorFactory() { 
     nameToClazz.put("splineV1Beta", SplineProcessor.class); 
     nameToClazz.put("invertV1Beta", InvertProcessor.class); 
} 

    @Override 
    public Processor get() { 
     String moduleName = threadLocal.get(); 
     if(moduleName == null) 
      throw new IllegalArgumentException("Please call ProcessorFactory.threadLocal.set(moduleName)"); 
     Class<?> clazz = nameToClazz.get(moduleName); 
     if(clazz == null) 
      return null; 

    try { 
     Object newInstance = clazz.newInstance(); 
     return (Processor) newInstance; 
    } catch (InstantiationException e) { 
     throw new RuntimeException(e); 
    } catch (IllegalAccessException e) { 
     throw new RuntimeException(e); 
    } finally { 
     threadLocal.set(null); 
    } 
} 

} 

ПРИМЕЧАНИЕ. Я все же хотел бы знать, как сделать это, хотя у меня есть этот открытый вопрос, который еще лучший способ сделать то же самое guice multibinder with Providers

, но, к сожалению, я не могу заставить это работать.

ПРИМЕЧАНИЕ. Какой код инъекции я также использую. Я использую следующий код для инъекции (и также попробовал ProcessorFactory).

@Inject 
private Provider<ProcessorSetup> processors; 

РЕДАКТИРОВАТЬ ДЛЯ БОЛЕЕ CLARIY

В боба У меня есть следующий

@Inject 
private Provider<ProcessorSetup> processors; 

и когда я называю processors.get(), это шаги в Guice, а затем правильно Guice вызывает ProcessorFactory. get(), и я прохожу через этот код, и мой новый entitiy проходит через Guice, чтобы быть возвращенным клиенту, но никогда не подключен к чему-либо. Это воняет, потому что у нас есть @Inject в тех сущностях, которые мы создаем. Я знаю, что около 2 лет назад я имел эту работу на другом проекте, связанном с этих постов

https://groups.google.com/forum/?fromgroups=#!searchin/google-guice/dean/google-guice/BZn2cnSeX64/MCRgFPjoHH4J

как я выяснить, как удалить форсунку в одной точке, наконец.

спасибо, Дин

ответ

1

мой новый enttiy проходит через Guice для возврата клиенту, но никогда не подключен ни к чему. Это воняет, потому что у нас есть @Inject в тех объектах, которые мы создаем, а также

Это как и ожидалось, так как вы создаете класс, используя clazz.newInstance(). Если вы хотите, чтобы Guice вводил его членов, вам нужно позвонить injector.injectMemebers(newInstance). Это будет вводить все поля и методы, но, очевидно, не создавать инъекции.

Я также предлагаю второе предложение заменить ThreadLocals AssitedInject для передачи параметров или просто создать пользовательскую фабрику вместо поставщика.

+0

Хммм, я думал, что это сработало раньше, не имея инжектора ... штопать. Мне нужно опробовать вспомогательную инъекцию и задать вопросы по этому вопросу, когда у меня есть проблемы. –

+0

Единственное, что могло бы сработать, это статические инъекции (но я не думаю, что это то, что вы хотите). Для простого примера изготовленной на заказ фабрики вы можете проверить, как это реализовано Guartz (Guice + Quartz). http://code.google.com/p/slurry/source/browse/quartz4guice/trunk/src/main/java/org/slurry/quartz4guice/internal/InjectorJobFactory.java –

+0

приятно, вы можете вводить инжектор. .. Я не думал/знал, что это возможно. –

1

Вы пытаетесь получить Guice использовать поставщик для создания экземпляров Processor? Если да, то вы должны изменить конфигурацию на что-то вроде:

bind(Processor.class).toProvider(ProcessorFactory.class); 

Это также выглядит как вы используете, что ThreadLocal для настройки получившихся экземпляров. Вы считаете Assisted Inject?

+0

Я всегда путался с их примерами, поскольку они не показывают весь код и пропускают вещи в местах. Я действительно хочу использовать MultiMapBinder, но это не работало, так как оно подходит как перчатка в этой ситуации. –

+0

Хммм, это, похоже, не сработало. Я добавил к своему вопросу, что я модифицировал свой инъект для Inject private Provider процессоров, и я вижу, что Guice correlty наследует класс, и я получаю новый класс. НО этот класс по какой-то причине не связан с его аннотациями @Inject .... странно. –

+0

Я хочу отметить в отладчике, Guice правильно звонит на мою фабрику под фреймворком Guice, но объект, который я передаю, не вводится с материалом Guice (и он был на старом проекте, который я сделал ... Я не знаю, я знаю, почему он не вводит материал после того, как я его создаю). –

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