`
kyo100900
  • 浏览: 640300 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Guice2.0的变化——第一部分 新的特性(上)

阅读更多

Guice2 有望于本月发布,但是它并不向下兼容 。很容易让人联想到 Python Python3000 的故事。文章分两部分:“新的特性”和“从 Guice1.0 迁徙到 2.0 ,先睹为快吧。

 

第一部分 新的特性

 

 

Small Features

 

l          Binder.getProvider AbstractModule.requireBinding 允许 module 使用声明式的方式,允许依赖于别的 Module

l          Binder.requestInjection 允许 module 为注册的实例在注入创建时 (Injector-creation time) 进行注入。

l          Providers.of() 方法永远保证返回相同的实例,这一点对测试来说很管用。

l          Scopes.NO_SCOPE 允许显示的设置一个“无作用域”。

l          Matcher.inSubpackage 用于匹配所有指定包下以及其子包下的所有 classes

l          Types 工具类 ( 改用泛型写了 ) 用于创建一个泛型的具体实现。( Guice 的泛型和标注真是用到出神入化的地步了)

l          AbstractModule.requireBinding 允许 module 编程方式的实现依赖。

 

 

Provider Methods

 

创建自定义的 Providers 不需要任何 boilerplate( 模板 ) 。在任意的 module 中,用 @Providers 标注来这样定义一个方法:

 

public class PaymentsModule extends AbstractModule {
	public void configure() {

	}

	@Provides
	@Singleton
	PaymentService providePaymentService(CustomerDb database) {
		DatabasePaymentService result = new DatabasePaymentService();
		result.setDatabase(database);
		result.setReplicationLevel(5);
		return result;
	}
}

 

 

在该方法 providePaymentService 中的所有参数都会被自动注入。当然,你还可配合使用 scoping annotation ,咱们这里用的就是 @Singleton 。最后方法返回的类型也就是咱们要绑定的类型。如果你期望方法返回时返回在一个 annotation 上,可以使用 @Named 来创建这样一个 annotated 类型。

当我看到这里的时候,我把我的理解说出来和大伙分享分享。通常来说,我们会在 Action 中像这样注入一些 Service

public class PaymentAction {

	public static final String SUCCESS = "success";

	@Inject
	private PaymentService paymentService;

	public String execute() {
		paymentService.execute();
		return SUCCESS;
	}
}
 

 

很好,代码简单明了。但是如果这个“ PaymentService ”在使用之前,还需要注入别的东西的话 ( 比如说 DateSource Constant 设置等 ) ,那么以往的做法就是在 PaymentService 中继续使用 @Inject 。不过,既然叫 Guice2.0 ,总得弄点新花样吧。这样 @Provides 就来了。它允许你的“ PaymentService ”在创建 module 的时候,将所需要的参数注入进去,进行相应初始化 ( 调用 providePaymentService 方法 ) ,最后再返回给你一个你真正想要的 paymentService 对象;如果你返回的是一个 annotation ,那么也没问题:

public class PaymentAction {

	public static final String SUCCESS = "success";

	@Inject
	Named foo;

	public String execute() {
		System.out.println(foo.getClass().toString() + " " + foo.value());
		return SUCCESS;
	}
}

 

 

相应的 PaymentsModule 中加入:

 

public class PaymentsModule extends AbstractModule {

	@Named("foo")
	private String foo;

	...

	@Provides
	@Singleton
	Named provideNamed() throws Exception {
		Named name = getClass().getDeclaredField("foo").getAnnotation(
				Named.class);
		return name;
	}
}

 

 

我想看到这里,大家应该明白了吧。继续 ~~~

 

 

Binding Overrides

Module functionalTestModule = Modules.override(new ProductionModule()).with(newOverridesModule());

 

 

顾名思义,允许用新的 module 来复盖原有的 module 。这样的好处在于,你可以开发测试中使用一套 test module ,而在正式的产品中使用另一套 production module

 

 

Multibindings, MapBindings

 

这也是 Guice2 新加入的,先将元素绑定在 Set Map 中,然后注入整个 Collection 。如果多个 module 都有同样的 Collection ,那么 Guice 会帮你合并。

public class SnacksModule extends AbstractModule {
  protected void configure() {
    MapBinder<String, Snack> mapBinder
        = MapBinder.newMapBinder(binder(), String.class, Snack.class);
    mapBinder.addBinding("twix").toInstance(new Twix());
    mapBinder.addBinding("snickers").toProvider(SnickersProvider.class);
    mapBinder.addBinding("skittles").to(Skittles.class);
  }
}
 

 

Private Modules

 

PrivateModules 用于创建并不需要对外可见的绑定对象。当然,这样会使得封装变得更加简单,还避免了冲突。

作者没有写关于 PrivateModules 的内容,有可能还没有更新完吧。我们就简单看一个例子:

public class FooBarBazModule extends PrivateModule {
   protected void configurePrivateBindings() {
     bind(Foo.class).to(RealFoo.class);
     expose(Foo.class); //expose方法用于向外部暴露内部的绑定Foo

     install(new TransactionalBarModule()); //install方法允许将本PrivateModule模块嵌入到TransactionalBarModule模块中去。
     expose(Bar.class).annotatedWith(Transactional.class); //expose方法用于向外部暴露内部的绑定Bar,并令其标注为Transactional

     bind(SomeImplementationDetail.class);
     install(new MoreImplementationDetailsModule());
   }

	//向外部暴露的方法
   @Provides @Exposed
   public Baz provideBaz() {
     return new SuperBaz();
   }
 }
 

 

 

 

15
0
分享到:
评论
3 楼 hantsy 2009-01-14  
呵呵,整个JavaEye很难发现如此有价值的文章。
2 楼 c43w 2009-01-13  
看看浏览次数,Guice有很多人在关注啊...
1 楼 kyo100900 2009-01-12  
文字太多了就被截断了,只好分开了

相关推荐

    guice-2.0.jar

    guice-2.0.jar guice-2.0.jar

    struts2+ibatis3+guice2.0使用完整例子

    采用的框架是struts2.1.8,ibatis3,guice2.0,完整的产品模块和权限模块(部分功能)例子。这是smeite.com商城第一版本的部分代码,测试通过。 希望给需要的朋友一个借鉴。 自我认为是学习Ibatis3比较好的例子,覆盖...

    Guice2.0+Hibernate3.2+warp-persist-2.0+Struts2+JPA

    轻量级的Guice2.0代替了Spring,速度更快,项目体积更小,Hibernate3.2与JPA的结合使用代替了传统的配置文件,使Hibernate的开发更简单,本项目基本上是零配置开发,由于我只能上传小于15M的文件,故JAR被我删除了,...

    Robojuice jar 包文件下载(内含guice-2.0-no_aop.jar 和roboguice-1.1.2.jar )

    `guice-2.0-no_aop.jar`是Guice的一个版本,不包含Aspect Oriented Programming(AOP)支持,这可能是因为在Android环境中,AOP的使用可能会增加复杂性和性能开销。 接下来,我们来看RoboGuice。RoboGuice是Guice的...

    guice-2.0-no_aop.jar

    guice-2.0-no_aop.jar

    基于guice的简单项目

    这些库提供了Guice的基本功能和扩展特性,如Assisted Injection,用于创建具有部分构造函数参数的复杂对象。 总结来说,这个基于Guice的HelloWorld项目旨在演示如何使用Guice框架进行依赖注入,以实现代码的松耦合...

    goole-guice所有JAR包

    Guice-2.0版本是Guice框架的一个早期版本,相比于现在的4.x版本,可能缺少一些特性,比如更多的范围选项、更完善的异常处理等。但是,即便是早期版本,Guice-2.0也已经提供了基本的依赖注入功能,足够应对许多中小...

    java guice dependency injection tutorial

    ### Java Guice 依赖注入教程 #### 概述 本文档详细介绍如何利用 Google 开源的依赖注入框架 Guice 进行 Java 开发...随着 Guice 2.0 的推出,开发者将能够体验到更多的新功能和改进,进一步提升开发效率和代码质量。

    guice.jar/guice.jar

    guice.jar guice.jar guice.jar guice.jar guice.jar guice.jar guice.jar

    guice-2.0-no_aop.jar中文-英文对照文档.zip

    (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以...

    Google Guice: Agile Lightweight Dependency Injection Framework

    - **现代化**:Guice充分拥抱了Java语言的新特性,如注解驱动的依赖注入。 - **适用场景**: - **Web应用开发**:可以与Struts 2或Wicket等流行框架结合使用。 - **企业级应用**:适用于大型、复杂的系统。 - *...

    guice入门教程helloworld篇

    Guice,全称为Google Guice,是一款轻量级的依赖注入框架,由Google开发并开源。依赖注入(Dependency Injection,DI)是一种设计模式,它帮助我们解耦代码,提高组件的可测试性和可维护性。Guice通过在运行时自动...

    Guice用户中文指南

    5. **强大的社区支持**:由于其开源特性,Guice拥有一个活跃的社区,提供了丰富的资源和支持。 #### 三、示例解析 在给定的部分内容中,首先介绍了一个简单的服务接口`Service`及其两个实现类:`ServiceImpl`和`...

    Guice 中文文档 例子

    Guice 是 Google 推出的一款轻量级的依赖注入框架,专为 Java 5 及其后续版本设计。依赖注入(Dependency Injection,简称 DI)是一种设计模式,它允许开发者在不直接创建对象的情况下,将依赖关系从代码中解耦出来...

    google guice 3.0源码

    Guice 3.0是其一个重要的版本,提供了许多改进和新特性。 在Guice 3.0源码中,我们可以深入学习以下几个关键知识点: 1. **依赖注入(Dependency Injection)**:Guice的核心概念是依赖注入,它允许我们声明所需的...

    mybatis-guice-3.6.zip

    MyBatis-Guice 3.6 是一个集成框架,它是MyBatis——一个流行的Java持久层框架——与Google的Guice依赖注入框架的完美结合。这个版本的MyBatis-Guice旨在简化MyBatis的配置过程,通过Guice的自动装配特性,帮助...

    Guice中文文档

    1. **定义接口**:首先定义一个`Service`接口,代表一种通用的服务功能。 2. **实现接口**:接着,实现`Service`接口的两个版本——`ServiceImpl`作为默认实现,`MockService`用于单元测试。 3. **传统工厂模式...

    DI容器框架Google Guice与Spring框架的区别

    Google Guice和Spring都是流行的Java平台上的DI框架,但它们在实现方式、功能特性和使用场景上有所不同。 **描述解析:** "DI容器,例如spring,picoContainer,EJB容器等等 与Guice的不同" 这里提到了更多的DI...

    jersey2.15集成guice笔记

    在Java Web开发中,Jersey是一个流行的RESTful服务实现框架,而Guice是Google提供的一个轻量级依赖注入(DI)容器。这篇笔记将深入探讨如何将这两个强大的工具集成为一体,以优化项目架构和提高代码可维护性。 **一...

    shiro,guice集成

    这种集成允许开发者利用 Guice 的强大特性来配置和管理 Shiro 组件,从而简化了安全层的实现。集成的主要目标是通过标准的 Guice 规范和机制来设置 Shiro 的核心组件,如 SecurityManager、Realm 等,并且支持 Web ...

Global site tag (gtag.js) - Google Analytics