`
wbj0110
  • 浏览: 1601087 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

Google Guice 高级教程02 - Guice的IOC容器(1)

阅读更多

6 Guice的IOC容器

6.1 注入过程

在前面的教程中我们讲了Guice注入例子,在使用上具体描述了Guice的注入过程。在下面的篇幅中我们从源码级了解了Guice的注入过程。

我们从具体到抽象再到具体的深入了解Guice的内部运作机制 。

下面一张序列图就是描述了Guice最简单的一次注入过程。比如下面的例子是我们熟悉的。

 

 1 public class HelloWorldDemo {
 2     public static void main(String[] args) {
 3         Injector inj = Guice.createInjector(new Module() {
 4             @Override
 5             public void configure(Binder binder) {
 6                 binder.bind(HelloWorld.class).to(HelloWorldImpl.class);
 7             }
 8         });
 9         HelloWorld hw = inj.getInstance(HelloWorld.class);
10         hw.sayHello();
11         //
12     }
13 }

 

 

GuiceInject01

从上面的图像可以看到我们的核心是Guice如何将我们的实例注入到Injector中的,这样客户端才能在Injector查找我们需要的服务。

我们进入Guice的createInjector方法,看看Guice到底做了什么操作。

 

public static Injector createInjector(Module modules) {
    
return createInjector(Arrays.asList(modules));
  }
   
public static Injector createInjector(Iterable<? extends Module> modules) {
    
return createInjector(Stage.DEVELOPMENT, modules);
  }
  
public static Injector createInjector(Stage stage, Module modules) {
    
return createInjector(stage, Arrays.asList(modules));
  }
  
public static Injector createInjector(Stage stage,
      Iterable
<? extends Module> modules) {
    
return new InjectorBuilder()
        .stage(stage)
        .addModules(modules)
        .build();
  }

 

从上面的代码可以看到我们的Injector是被InjectorBuilder以Builder的模式构造出来的。同时我们也可以注入多个Module,并且默认情况下Guice是以Stage.DEVELOPMENT模式运行的。

在进入我们最核心的InjectorBuilder之前,我们先简化下模型。所谓的IOC容器,或者说DI容器,我们可以看做是一个特殊的Map,这个Map能够将我们的对象按照某种Key(键值)的方式存入,然后客户端能够根据Key来获取我们的对象。因此为了了解Guice容器的内部结构,我们先要了解下Guice容器中存放一个对象的Key到底是什么。

6.2 容器Key

在Guice中用com.google.inject.Key<T>对象来描述一个实例可以对应的Key。

我们可以想象,如果我们以某种类型来从Map中获取结果,那么对于同一种类型每次获取的结果就一样。看似满足需求。但是如果某一种类型对应多种实例怎么办?这种情况下我们就需要我们的Key不仅支持类型,还附带另外一点点东西。Guice是完全基于Annotation的,没有类似spring那样唯一id的概念,于是在Guice中描述一个Key就是靠类型和注解来完成的。在基础教程中我们看到了对于同一种类型,加了不同的注解获取的就是不同的实例。

在Java中每一个对象都有一个类型的概念,即使私有类型比如int,boolean也是有类型的概念,但是自从Java 5推出泛型以后,一直没有一种描述泛型的类型。比如说List<String>在Java中使用List类型来描述的。但是尽管JVM有运行时擦除泛型的特点,却又有能够获取编译前类型的特性,因此实际上List<String>和List<Integer>对于我们来说应该是两种不同的类型。

Guice自创造了一种描述类型的方式,包括泛型类型。在Guice中使用com.google.inject.TypeLiteral<T>类描述所有的类型(包括泛型类型)。我们可以写一个小的例子来看看。

 

/**
* $Id: TypeLiteralDemo.java 110 2010-01-08 03:06:53Z xylz $
* xylz study project (www.imxylz.cn)
*/
package cn.imxylz.study.guice.inner;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
import com.google.inject.TypeLiteral;
/** a demo for using {@link TypeLiteral}
@author
@version $Rev: 110 $
*/
public class TypeLiteralDemo {
    
public static void main(String[] args) throws Exception{
        
//
        System.out.println(String.format("guice type:%s", TypeLiteral.get(Boolean.class)));
        System.out.println(String.format(
"java type:%s", Boolean.class));
        System.out.println();
        
//
        System.out.println(String.format("guice type:%s", TypeLiteral.get(int.class)));
        System.out.println(String.format(
"java type:%s"int.class));
        System.out.println();
        
//
        System.out.println(String.format("guice type:%s"new TypeLiteral<Map<Integer, String>>(){}));
        System.out.println(String.format(
"java type:%s"new HashMap<Integer,String>().getClass()));
        System.out.println();
        
//
        Method m = Map.class.getMethod("keySet"new Class[0]);
        System.out.println(String.format(
"java type:%s", m.getReturnType()));
        System.out.println(String.format(
"java generic type:%s", m.getGenericReturnType()));
        System.out.println(String.format(
"guice type:%s", TypeLiteral.get(m.getGenericReturnType())));
        System.out.println();
        TypeLiteral
<Map<Integer, String>> mapType = new TypeLiteral<Map<Integer, String>>() {};
        System.out.println(String.format(
"guice type:%s", mapType.getReturnType(m)));
    }
}

 

下面是一次输出结果。

 

guice type:java.lang.Boolean
java type:
class java.lang.Boolean
guice type:
int
java type:
int
guice type:java.util.Map
<java.lang.Integer, java.lang.String>
java type:
class java.util.HashMap
java type:
interface java.util.Set
java generic type:java.util.Set
<K>
guice type:java.util.Set
<K>
guice type:java.util.Set
<java.lang.Integer>

 

从上面的结果可以看出,Java通过一些反射机制描述了部分泛型的类型(使用java.lang.reflect.ParameterizedType来描述,其它类型使用java.lang.reflect.Type来描述,注意Class是实现了Type接口的),但是并不完整,因此Guice重写了这部分。

 

image

在上面的类图中我们可以看到,一个key是包含一个类型描述(TypeLiteral)和一个AnnotationStrategy的。AnnotationStrategy是由Annotation以及Annotation的类型组成。而TypeLiteral包含私有类型Class和对Key的引用的。

总之在Guice中是通过类型描述和注解(Key)来完整实例描述的,通过一个Key就我们能够从Guice容器(Injector)中获取我们需要的实例,至于这个实例是单个实例还是一组实例(Set或者Map类型的实例),后面会继续探讨。

分享到:
评论

相关推荐

    guice-3.0.rar

    Guice是Google开发的一款轻量级的Inversion of Control(IoC)容器,它通过依赖注入(Dependency Injection,DI)来管理对象的生命周期和装配。Guice-3.0是Guice的一个版本,包含了核心库guice-3.0.jar,以及与...

    14 离开了Spring,IoC容器还可以怎么做?慕课专栏1

    4. **Guice IoC容器**:Guice是Google开发的一个轻量级替代品,它强调无配置和简单的API。Guice使用注解来声明依赖关系,通过模块(Module)来定义绑定规则,使代码更简洁且易于维护。 ```java // Guice模块示例 ...

    Google guice

    **Google Guice**,全称为Google Injection,是一个轻量级的依赖注入框架,它通过注解(Annotations)来实现对象的自动装配,简化了Java应用的构造和管理。Guice的核心理念是帮助开发者摆脱手动创建对象和管理对象...

    Learning Google Guice

    标题《Learning Google Guice》指出本文档是关于学习谷歌Guice的,Guice是由谷歌开发的一个轻量级的依赖注入框架,其核心理念是简化Java应用程序中组件的创建和组装过程,通过依赖注入提高模块间的解耦,从而使得...

    google guice基础例子

    Guice是Google开发的一个轻量级,基于Java5(主要运用泛型与注释特性)的依赖注入框架(IOC)。Guice非常小而且快。Guice是类型安全的,它能够对构造函数,属性,方法(包含任意个参数的任意方法,而不仅仅是setter...

    guice-3.0.jar

    guice-3.0.jar ,Guice是Google开发的一个轻量级依赖注入框架(IOC)。Guice非常小而且快,功能类似与Spring,但效率上网上文档显示是它的100倍,而且还提供对Servlet,AOP,Struts等框架的支持;

    goole-guice所有JAR包

    Guice,全称为Google Guice,是Google推出的一款轻量级的依赖注入(Dependency Injection,简称DI)框架,专门用于简化Java应用中的对象组装和管理。依赖注入是一种设计模式,它可以帮助开发者降低代码间的耦合,...

    轻松理解Java面试和开发中的IoC(控制反转)

    这个容器可以是Spring、Guice等框架提供的IoC容器。控制反转模式可以使得系统更加灵活、可扩展和易于维护。 IoC容器的实现 ------------- IoC容器的实现可以通过工厂模式和反射机制来实现。工厂模式可以用来生成...

    An_IoC_Container_in_15_min

    **文件列表:** "An IoC Container in 15 min" 可能是一个文档或教程,详细阐述了构建IoC容器的步骤和过程,以快速上手的方式呈现。 **详细知识点:** 1. **IoC(Inversion of Control)原理:** IoC是一种设计...

    Google Guice入世(转 附带一Guice1.0的简单测试代码)

    依赖注入(Dependency Injection,DI)是一种设计模式,其核心思想是将对象的创建和组装过程从对象本身剥离出来,由一个外部容器(如Guice)负责处理。这样可以提高代码的可测试性、可维护性和可扩展性。 Guice通过...

    snake-guice.orig:基于google-guice的简单轻量级Python依赖注入框架

    snake-guice是一个基于google-guice的简单、轻量级的 Python 依赖注入框架。 Guice 的处理方式与当前的 XML IoC 容器有很大不同。 这是实验代码。 API 可能会改变,实现肯定会改变。 有关更多信息,请参阅。

    Java轻量级IOC框架Guice

    Guice是由Google大牛Bob lee开发的一款轻量级的java IoC容器。其优势在于:  速度快,号称比spring快100倍。  无外部配置(如需要使用外部可以可以选用Guice的扩展包),完全基于annotation特性,支持重构,代码...

    IOC的原理以及自定义使用

    虽然有许多成熟的IOC容器,如Spring、Guice等,但理解其原理并自定义实现有助于深入学习。自定义IOC主要包括以下几个步骤: 1. **创建Bean仓库**:用于存储所有的Bean定义,包括类名、构造函数、依赖关系等信息。 2....

    Guice4.2_jar及使用手册及示例

    Spring框架的依赖注入是家喻户晓的,但是在实际的开发中我们想使用便捷的依赖注入功能,但是又不想引入Spring框架的复杂性,该怎么办呢?...Google Guice一个不错选择。本资源中GUICE的使用方法和使用示例

    Guice 3.0 Programming Guide

    《Guice 3.0 编程指南》由谷歌编写,旨在指导开发者如何有效地利用Guice框架进行面向接口编程,实现依赖注入(Dependency Injection, DI)以及控制反转(Inversion of Control, IoC),从而构建出更加模块化、易于...

    warp-persist-2.0-20090214.zip

    Warp框架充分利用了JDK5.0的Annotation和泛型机制,并且基于Google Guice这个IoC框架,提供了full-stack的Web开发设施,他主要包含了四个部分: warp-persist框架:封装Hibernate和JPA,提供事务管理和持久化资源...

    Spring_3.x企业应用开发实战 目录

    - **ApplicationContext介绍**:更高级的 IoC 容器,提供更多的功能。 - **父子容器**:支持层次化的容器结构。 - **3.5 Bean的生命周期** - **BeanFactory中Bean的生命周期**:介绍 Bean 在不同容器中的生命...

    mina-guice:Guice对Apache MINA的支持

    这样,您可以根据需要在Guice的IoC容器中配置尽可能多的MINA应用程序。 特征支持MINA 2.0.9 支持Guice 3.0 除Apache MINA和Guice 3.0外,不依赖第三方库无需多重绑定。 IoFilter自动链接到javax.inject.Named 动机...

    tapioca:Tapioca 旨在在标准 Java 类库的现有部分(尽管有些模糊)之上提供一个极薄的层,以提供 IoC 容器

    什么是木薯粉? Tapioca 旨在在标准 Java 类库的现有部分... 如果您需要高质量和全功能的 IoC/DI 容器,请务必使用 Spring 或 Google 的 Guice 进行调查。 如果您需要一个具有零外部依赖关系的极其轻量级的容器,Ta

Global site tag (gtag.js) - Google Analytics