Guice动态注入自定义注释

我有一些资源,但我不能迭代它并将它们全部绑定,我必须使用密钥来请求资源。所以,我必须动态注入。

我定义了一个注释

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

像这样用

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

我必须处理由@Res注释的@Res ,我需要知道注入字段和注释。

这在Guice有可能吗? 即使有spi?

我按照CustomInjections进行操作

像这样的代码

 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  void hear(TypeLiteral type, TypeEncounter encounter) { Class 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(prop, field)); } } }); } class PropInjector implements MembersInjector { 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); } } } }