Guice 的架构分成两个不同的阶段:启动和运行。<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

1.启动阶段

执行流程如下:

1)首先创建自定义模块类实例,并将其传入 Guice.createInjector()

2Guice 创建一个绑定器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一个需要绑定的 类的 实例,同时还可以实现我们自己的providerGuice可以向其中注入依赖关系。

每个绑定还有一个可选的作用域。缺省情况下绑定没有作用域,Guice为每一次注入创建一个新的对象,定制的作用域可以使我们控制 Guice 是否 创建新对象。例如,为每一个HttpSession创建一个实例。

1  Guice启动阶段执行流程

下面我们来学习Guice是如何工作的,先来看一下Guice对接口及其实现类之间的绑定。Guice执行流程如下:

1)根据业务需求定义业务接口及其实现类。

2)定义Module接口实现类,并覆盖Module接口中的configure方法,同时通过Binder类进行具体绑定。我们将Module接口实现类称为绑定类。

接口绑定类 代码 1 所示。

代码 接口绑定类

public class 绑定类implements Module {

         public void configure(Binder binder) {

                  binder.bind(接口.class).to(实现类.class);

         }

}

3调用com.google.inject包中的Guice类,通过此类的createInjector方法来实现一个简单的注入,代码12-2所示

代码 注入方法createInjector

Guice.createInjector(new Bind())

4调用绑定接口实现接口和实现类的依赖注入 代码 3 所示。

代码 取得注入方法

Guice.createInjector(new Bind()).getInstance(接口类);

使用Guice进行接口绑定如2所示。

2  使用Guice进行接口绑定


体验Guice

从上文读者已经了解Guice的执行流程,本节我们将通过一个输出语句来进一步学习Guice

定义接口及其实现类分别为SunyangSunyangImpl,绑定类为Bind,如代码45所示。

代码 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所示。

代码 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所示的结果。

3  使用成员变量注入