Мы решили использовать Dependency Injection с аннотациями JSR-330 для наших будущих усилий по модульности и были очень довольны первым результатом, основанным на Guice 2. SVN.
Теперь нам нужно обеспечить и документировать черезмодульные тесты, которые нам нужны, также работают в Spring при программной настройке (нам нужна та же поддержка рефакторинга, что и в Guice, поэтому нет файлов XML).У меня проблемы с @Provider
и @Inject @Named("foo") String
, но я сделал простую @Inject
работу с:
ApplicationContext ctx = new AnnotationConfigApplicationContext(LIBL_Object.class,
CORE_Provider.class);
this.object = ctx.getBean(LIBL_Object.class);
, где LIBL_Object - это базовый класс, который нужно вставить в , ноCORE_Provider не регистрируется, как я надеялся в Spring.
Реализация CORE_Provider
package qa.jsr330.core;
import javax.inject.Provider;
public class CORE_Provider implements Provider<ProvidedInterface> {
@Override
public ProvidedInterface get() {
return new CORE_Provided();
}
}
, и я хочу, чтобы он был внедрен в
package qa.jsr330.core;
import javax.inject.Inject;
public class LIBL_Object {
private ProvidedInterface provided;
public ProvidedInterface getProvided() {
return provided;
}
@Inject
public void setProvided(ProvidedInterface provided) {
this.provided = provided;
}
// Other stuff omitted.
}
Также мы обнаружили, чтомы можем очень четко передать значения конфигурации, используя тег @Named.Этот код выглядит следующим образом:
String hostname;
@Inject
public void setHostname(@Named("as400.hostname") String hostname) {
this.hostname = hostname;
}
, где мы можем зарегистрировать эту строку в Guice, используя
bindConstant().annotatedWith(Names.named("as400.hostname")).to(value);
Итак, два вопроса:
- Как сделатьЯ регистрирую класс
@Provider
в Spring 3 программно? - Как зарегистрировать строковую константу в Spring 3, чтобы @Named выбирал ее правильно?