对命名字符串字段进行Guice注入

IAm*_*aja 7 java dependency-injection guice

我有一节课:

public class FizzBuzz {
    @Named("Red") private String redService;

    public static void main(String[] args) {
        GuiceTest testApp = new GuiceTest();

        testApp.run();
    }

    private void run() {
        Injector inj = Guice.createInjector(new MyModule());

        redService = (String)inj.getInstance(String.class);

        // Should print "red-service" but is instead an empty string!
        System.out.println("redService = " + redService);
    }

    // ... Rest of class omitted for brevity
}

public class MyModule extends AbstractModule {
    @Override
    protected void configure() {
        bind(String.class).annotatedWith(Names.named("Red")).toInstance("red-service");
    }
}
Run Code Online (Sandbox Code Playgroud)

在我的模块中,我指示Guice将所有String.class实例@Named"Red" 绑定到字符串实例"red-service",但是我没有在输出的print语句中看到它.我如何错误地使用Guice?

Jan*_*ski 23

让我简要总结一下这里已经提出的一些意见......

  1. 你忘记了@Inject注释
  2. 我强烈建议将Guice/Injector放在外面FizzFuzz.使用静态main方法引导您的应用程序(不是run()).
  3. 将字符串绑定到常量可以很容易地通过bindConstant.

这会带给你这样的东西:

public class FizzFuzz {
    @Inject
    @Named("red")
    private String service;

    public static void main(String[] args) {
        FizzFuzz fizzFuzz = Guice.createInjector(new AbstractModule() {
            @Override
            protected void configure() {
                bindConstant().annotatedWith(Names.named("red")).to("red-service");
            }    
        }).getInstance(FizzFuzz.class);

        System.out.println(fizzFuzz.service);
    }
}
Run Code Online (Sandbox Code Playgroud)