Guice 的架构分成两个不同的阶段:启动和运行。<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
1.启动阶段
执行流程如下:
(1)首先创建自定义模块类实例,并将其传入 Guice.createInjector()。
(2)Guice 创建一个绑定器Binder,并将其传入自定义模块。
(3)自定义模块使用绑定器来定义绑定。
(4)基于自定义模块所定义的绑定,Guice 创建一个注入器Injector,并将其返回给自定义模块。
(5)自定义模块使用注入器来注入对象。
2
.运行阶段
可以使用启动阶段创建的注入器来注入对象并内省(introspect)我们的绑定。Guice运行时的模型
由一个可
管理一定数量绑定的注入器
组成
。Guice运行模型如图1所示。
<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />
图1 Guice运行模型
Key键唯一地
确定
每一个绑定,它包含了客户代码所依赖的类型及一个可选的标注,可以使用标注来区分指向同一类型的
多个
绑定。Key的类型和标注对应于注入时的类型和标注。
每个绑定有一个提供器provider,它提供所需类型的实例。我们可以定义一个类,Guice会创建它的实例。也可以给Guice一个需要绑定的
类的
实例,同时还可以实现我们自己的provider,Guice可以向其中注入依赖关系。
每个绑定还有一个可选的作用域。缺省情况下绑定没有作用域,Guice为每一次注入创建一个新的对象,定制的作用域可以使我们控制 Guice
是否
创建新对象。例如,为每一个HttpSession创建一个实例。
1 Guice启动阶段执行流程
下面我们来学习Guice是如何工作的,先来看一下Guice对接口及其实现类之间的绑定。Guice执行流程如下:
(1)根据业务需求定义业务接口及其实现类。
(2)定义Module接口实现类,并覆盖Module接口中的configure方法,同时通过Binder类进行具体绑定。我们将Module接口实现类称为绑定类。
接口绑定类如
代码
1
所示。
代码
1
接口绑定类
public class 绑定类implements Module {
public void configure(Binder binder) {
binder.bind(接口.class).to(实现类.class);
}
}
(3)调用com.google.inject包中的Guice类,通过此类的createInjector方法来实现一个简单的注入,如代码12-2所示
。
代码
2
注入方法createInjector
Guice.createInjector(new Bind())
(4)调用绑定接口,实现接口和实现类的依赖注入,如
代码
3
所示。
代码
3
取得注入方法
Guice.createInjector(new Bind()).getInstance(接口类);
使用Guice进行接口绑定如图2所示。
图2 使用Guice进行接口绑定
![](https://i-blog.csdnimg.cn/blog_migrate/f05512801642be348a0b154894cf3250.jpeg)
体验Guice
从上文读者已经了解Guice的执行流程,本节我们将通过一个输出语句来进一步学习Guice。
定义接口及其实现类分别为Sunyang、SunyangImpl,绑定类为Bind,如代码4和5所示。
代码
4
接口Sunyang
package sunyang;
public interface Sunyang {
public void print();
}
代码
5
接口实现类SunyangImpl
package sunyang;
public class SunyangImpl implements Sunyang {
public void print() {
System.out.println("技术凝聚实力,专业创造辉煌");
}
}
实现Module接口的类Bind如代码6所示。
代码
6
类Bind.java
package sunyang.Module;
import sunyang.Sunyang;
import sunyang.SunyangImpl;
import com.google.inject.Binder;
import com.google.inject.Module;
public class Bind implements Module {
public void configure(Binder binder) {
binder.bind(Sunyang.class).to(SunyangImpl.class);
}
public static void main(String[] args) {
Guice.createInjector(new Bind()).getInstance(Sunyang.class).print();
}
}
在这段代码的main方法中得到类里边被注入的接口Sunyang,然后执行它的print方法。执行这个main方法得到的如图12-3所示的结果。
![](https://i-blog.csdnimg.cn/blog_migrate/2f6bede53bc3e00b133b07fa21c98e62.jpeg)
图3 使用成员变量注入
转载于:https://blog.51cto.com/fanlifeng/214808