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 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(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); } } } }