第 5 章 绑定常量

感觉没什么大用处的东西,打算把int或String值写上,定义个常量多好,还直观。

5.1. bindConstant() + 注解 + to()

像以前一样自己定义一个注解:TheAnswer.java

import java.lang.annotation.*;
import com.google.inject.*;

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.PARAMETER})
@BindingAnnotation
public @interface TheAnswer {
}
        

这个类没什么可解释的,就是一个没有任何属性的BindingAnnotation。

现在看Main.java的部分。

import com.google.inject.*;

public class Main {

    @Inject
    @TheAnswer
    private int answer;

    public static void main(String[] args) {
        Main main = Guice.createInjector(new Module() {
            public void configure(Binder binder) {
                binder.bindConstant()
                    .annotatedWith(TheAnswer.class)
                    .to(42);
            }
        }).getInstance(Main.class);

        System.out.println(main.answer);
    }
}
        

bindConstant()告诉guice在遇到TheAnswer.class这个类的时候,就把42这个值绑定上去。这样我们的@Inject @TheAnswer private int answer;的值就会变成42,后面打印main.anwswer可以验证这一点。

既然我们可以使用自定义注解,那么这里也可以替换成@Named,这里不再赘述。

例子:05-01。

5.2. bind() + 注解 + toInstance()

TheAnswer.java不变,只改Main.java。

import com.google.inject.*;

public class Main {

    @Inject
    @TheAnswer
    private int answer;

    public static void main(String[] args) {
        Main main = Guice.createInjector(new Module() {
            public void configure(Binder binder) {
                binder.bind(int.class)
                    .annotatedWith(TheAnswer.class)
                    .toInstance(42);
            }
        }).getInstance(Main.class);

        System.out.println(main.answer);
    }
}
        

这次使用bind(int.class)告诉我们这次处理的是int.class类型,注解还是使用TheAnswer.class,不过以前我们用to(Some.class)绑定的一个Class类,这次我们用的是toInstance()直接绑定一个具体的数值。

最后运行的结果与之前相同,不信去试。

例子:05-02。