Java GoogleGuice命名为vs注释

Java GoogleGuice命名为vs注释,java,dependency-injection,guice,Java,Dependency Injection,Guice,我正在浏览GoogleGuice文档,并阅读了有关它的信息。基本上有两种选择 @命名 绑定注释 我的问题是,哪一个更好 使用@命名我不必创建锅炉板来使用注释,但它以降低类型安全性为代价。注释代码看起来更干净。如前所述,您一般指定了绑定注释的优点和缺点。 你的陈述是正确的 @Named的另一个优点是使用Names.bindProperties绑定属性。 其中使用绑定注释是不相关的。 看 对于非目标绑定(听起来像是实际的问题),文档说明了两个选项 如果不想使用binding annotation/@

我正在浏览GoogleGuice文档,并阅读了有关它的信息。基本上有两种选择

  • @命名
  • 绑定注释
  • 我的问题是,哪一个更好


    使用
    @命名
    我不必创建锅炉板来使用
    注释
    ,但它以降低类型安全性为代价。注释代码看起来更干净。

    如前所述,您一般指定了绑定注释的优点和缺点。
    你的陈述是正确的

    @Named的另一个优点是使用Names.bindProperties绑定属性。 其中使用绑定注释是不相关的。 看

    对于非目标绑定(听起来像是实际的问题),文档说明了两个选项

    如果不想使用binding annotation/@Named,只需将绑定声明到具体类即可。
    例如

    需要使用绑定注释/@命名您必须仍然添加目标绑定,即“.toSometing”方法(to、toProvider、toContractor等)

    例如:

    public class TestUntargetBinding {
    
        @Test
        void testTargetBindingViaImplementBy() {
            final var injector = Guice.createInjector(new AbstractModule() {
                @Override
                public void configure() {
                    bind(MyConcreteClass.class)
                            .annotatedWith(Names.named("100"))
                            .toProvider(() -> new MyConcreteClass(100));
                    bind(MyConcreteClass.class)
                            .annotatedWith(Names.named("200"))
                            .toProvider(() -> new MyConcreteClass(200));
    
                }
            });
            //imagine a class with a constructor
            // @Inject
            // SomeClass(@Named("100) MyConcreteClass myConcreteClass1){...}
            final var myConcreteClass1 = injector.getInstance(Key.get(MyConcreteClass.class, Names.named("100")));
            final var myConcreteClass2 = injector.getInstance(Key.get(MyConcreteClass.class, Names.named("200")));
    
            assertThat(myConcreteClass1.doSomething(), Is.is(100));
            assertThat(myConcreteClass2.doSomething(), Is.is(200));
    
        }
    
        static class MyConcreteClass {
            private int i;
    
            public MyConcreteClass(int i) {
                this.i = i;
            }
    
            public int doSomething() {
                return i;
            }
        }
    }
    

    Guice将不知道要将名称/注释绑定到哪个witch类,除非您指定“toProvider

    您按照说明指定了绑定注释的一般利弊。
    你的陈述是正确的

    @Named的另一个优点是使用Names.bindProperties绑定属性。 其中使用绑定注释是不相关的。 看

    对于非目标绑定(听起来像是实际的问题),文档说明了两个选项

    如果不想使用binding annotation/@Named,只需将绑定声明到具体类即可。
    例如

    需要使用绑定注释/@命名您必须仍然添加目标绑定,即“.toSometing”方法(to、toProvider、toContractor等)

    例如:

    public class TestUntargetBinding {
    
        @Test
        void testTargetBindingViaImplementBy() {
            final var injector = Guice.createInjector(new AbstractModule() {
                @Override
                public void configure() {
                    bind(MyConcreteClass.class)
                            .annotatedWith(Names.named("100"))
                            .toProvider(() -> new MyConcreteClass(100));
                    bind(MyConcreteClass.class)
                            .annotatedWith(Names.named("200"))
                            .toProvider(() -> new MyConcreteClass(200));
    
                }
            });
            //imagine a class with a constructor
            // @Inject
            // SomeClass(@Named("100) MyConcreteClass myConcreteClass1){...}
            final var myConcreteClass1 = injector.getInstance(Key.get(MyConcreteClass.class, Names.named("100")));
            final var myConcreteClass2 = injector.getInstance(Key.get(MyConcreteClass.class, Names.named("200")));
    
            assertThat(myConcreteClass1.doSomething(), Is.is(100));
            assertThat(myConcreteClass2.doSomething(), Is.is(200));
    
        }
    
        static class MyConcreteClass {
            private int i;
    
            public MyConcreteClass(int i) {
                this.i = i;
            }
    
            public int doSomething() {
                return i;
            }
        }
    }
    

    Guice不会知道要将名称/注释绑定到哪个witch类,除非您指定“toProvider

    Guice链接提到
    ,因为编译器无法检查字符串,我们建议谨慎使用@Named。定义自己专门构建的注释可以提供更好的类型安全性。
    有人能解释一下它所说的类型安全性吗?Guice link提到,
    由于编译器无法检查字符串,我们建议少用@Named。定义自己专门构建的注释可以提供更好的类型安全性。
    有人能解释一下它所说的类型安全性吗?