2014-06-12 22 views
6

Ich habe einige Ressourcen, aber ich kann nicht iterator es und binden sie alle, Ich muss den Schlüssel verwenden, um die Ressource.So, ich muss dynamisch injizieren.Guice dynamische injizieren mit benutzerdefinierten Annotation

definiere ich eine Anmerkung wie

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

Verwendung wie diese

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

Ich habe die Injektion von @Res kommentierte zu handhaben und ich brauche das inject Feld und die Anmerkung kennen.

Ist dies möglich in Guice und wie? sogar mit spi?

+0

möglich Duplikat https://stackoverflow.com/questions/5704918/custom-guice-binding-annotations-with-parameters und https : //stackoverflow.com/questions/41958321/guicebinding-annotations-with-attributes – Phil

Antwort

3

Ich arbeite folgen aus CustomInjections

Code wie dieses

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); 
      } 
     } 
    } 
} 
Verwandte Themen