感觉没什么大用处的东西,打算把int或String值写上,定义个常量多好,还直观。
像以前一样自己定义一个注解: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。
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。