2014-06-12 21 views
6

Mam pewne zasoby, ale nie mogę iterować go i powiązać je wszystkie, Muszę użyć klucza, aby poprosić o zasób. Więc muszę dynamicznie wstrzykiwać.Guice dynamiczne wstrzykiwanie z niestandardową adnotacją

zdefiniować adnotację jak

@Target({ METHOD, CONSTRUCTOR, FIELD }) 
@Retention(RUNTIME) 
@Documented 
@BindingAnnotation 
public @interface Res 
{ 
    String value();// the key of the resource 
} 

użytku jak ten

public class Test 
{ 
    @Inject 
    @Res("author.name") 
    String name; 
    @Inject 
    @Res("author.age") 
    int age; 
    @Inject 
    @Res("author.blog") 
    Uri blog; 
} 

muszę sobie zastrzyk uwagami przez @Res i muszę znać wstrzykiwać pola i adnotacji.

Czy to możliwe w Guice i jak? nawet ze spi?

+0

możliwym duplikatu https://stackoverflow.com/questions/5704918/custom-guice-binding-annotations-with-parameters i https : //stackoverflow.com/questions/41958321/guicebinding-annotations-with-attributes – Phil

Odpowiedz

3

ćwiczę śledzić CustomInjections

kod jak ten

public class PropsModule extends AbstractModule 
{ 
    private final Props props; 
    private final InProps inProps; 

    private PropsModule(Props props) 
    { 
     this.props = props; 
     this.inProps = InProps.in(props); 
    } 

    public static PropsModule of(Props props) 
    { 
     return new PropsModule(props); 
    } 

    @Override 
    protected void configure() 
    { 
     bindListener(Matchers.any(), new TypeListener() 
     { 
      @Override 
      public <I> void hear(TypeLiteral<I> type, TypeEncounter<I> encounter) 
      { 
       Class<? super I> clazz = type.getRawType(); 
       if (!clazz.isAnnotationPresent(WithProp.class)) 
        return; 
       for (Field field : clazz.getDeclaredFields()) 
       { 
        Prop prop = field.getAnnotation(Prop.class); 
        if (prop == null) 
         continue; 

        encounter.register(new PropInjector<I>(prop, field)); 
       } 
      } 
     }); 
    } 

    class PropInjector<T> implements MembersInjector<T> 
    { 
     private final Prop prop; 
     private final Field field; 

     PropInjector(Prop prop, Field field) 
     { 
      this.prop = prop; 
      this.field = field; 
      field.setAccessible(true); 
     } 

     @Override 
     public void injectMembers(T instance) 
     { 
      try { 
       Class<?> targetType = field.getType(); 
       Object val = inProps.as(prop.value(), targetType); 
       field.set(instance, val); 
      } catch (IllegalAccessException e) { 
       throw new RuntimeException(e); 
      } 
     } 
    } 
} 
Powiązane problemy