java—是否有可能知道谁(什么类型)询问了依赖关系?

xj3cbfub  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(304)

我正在使用一个注入侦听器来进行注入后初始化。假设我创建了这个注解:

@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

有可能吗?

ccgok5k5

ccgok5k51#

你可以这样做 ProvisionListener.getDependencyChain() . 现在已经不赞成了,但他们给出了一些替换的例子。

相关问题