我正在使用一个注入侦听器来进行注入后初始化。假设我创建了这个注解:
@Retention(RetentionPolicy.RUNTIME)
public static @interface PrintValue {
String value() default "";
}
现在我每次都想要一个 PrintValue
类打印此值。例如,如果类是这样的:
@PrintValue("Something")
public static class Foo {
}
,每次调用foo时,我的“后注入”启动就是打印它的值。但是,我想添加一个例外。我试过很多事情,但都没能做到。
如果一个类看起来像这样:
@PrintValue("Something else")
public static class Bar {
@Inject
public Bar(Foo foo) {
System.out.println("Constructed a bar");
}
}
我不希望foo的后期启动发生,因为请求foo的对象是 PrintValue
班级。换句话说,这个“其他东西”@覆盖了 PrintValue
当然是福。我能想到的唯一能让我实现它的方法,就是进入监听器,请求依赖关系的对象的类。请参阅完整的示例并注意 InjectionListener
:
public class GuiceListener {
@Retention(RetentionPolicy.RUNTIME)
public static @interface PrintValue {
String value() default "";
}
@PrintValue("Something")
public static class Foo {
}
@PrintValue("Something else")
public static class Bar {
@Inject
public Bar(Foo foo) {
System.out.println("Constructed a bar");
}
}
public static void main(String[] args) {
Module module = new AbstractModule() {
@Override
protected void configure() {
bind(Foo.class);
bind(Bar.class);
bindListener(Matchers.any(), new TypeListener() {
@Override
public <I> void hear(TypeLiteral<I> type, TypeEncounter<I> encounter) {
if (type.getRawType().isAnnotationPresent(PrintValue.class)) {
encounter.register(new PrintValueInjectionListener());
}
}
});
}
};
Injector injector = Guice.createInjector(module);
Foo foo = injector.getInstance(Foo.class);
Bar bar = injector.getInstance(Bar.class);
}
public static class PrintValueInjectionListener implements InjectionListener<Object> {
@Override
public void afterInjection(Object injectee) {
//get here who asked (its class) the injectee ??
PrintValue printValue = injectee.getClass().getAnnotation(PrintValue.class);
System.out.println(printValue.value());
}
}
}
如果我运行这个,我会得到如下输出:
Something
Something
Constructed a bar
Something else
但我想要的结果是:
Something (printed because of the Foo foo = injector.getInstance(Foo.class))
Constructed a bar
Something else
有可能吗?
1条答案
按热度按时间ccgok5k51#
你可以这样做
ProvisionListener.getDependencyChain()
. 现在已经不赞成了,但他们给出了一些替换的例子。