`
kyo100900
  • 浏览: 633633 次
  • 性别: 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 )

    Robojuice jar 包文件下载(内含guice-2.0-no_aop.jar 和roboguice-1.1.2.jar ) 另外附 Rogojuice 教程.txt

    guice-2.0-no_aop.jar

    guice-2.0-no_aop.jar

    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基础例子

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

    jetty-mybatis-guice

    该子项目着眼于 MyBatis、Guice 和 Jetty——逐渐建立起来,将它们全部放在 jetty-mybatis-guice 子项目中。 大多数项目最初都是基于教程等的小型入门项目。 所有子项目都包含 NOTES.txt 文件。 最有趣的一个是...

    guice入门学习资料

    guice 学习资料,快速掌握guice的编程技巧以及了解其机制。

    Google Guice: Agile Lightweight Dependency Injection Framework

    Product Description Guice (pronounced "Juice") is the ... 1 edition (April 21, 2008) * Language: English * ISBN-10: 1590599977 * ISBN-13: 978-1590599976 * Product Dimensions: 9.1 x 7.5 x 0.6 inches

    spring security 4 需要 jar 包

    guice-2.0-javadoc.jar guice-2.0-sources.jar guice-2.0-src.jar guice-2.0.jar httpclient-4.1.1.jar jsr250-api-1.0.jar ldapsdk-4.1.jar openid4java-nodeps-0.9.6.jar shared-ldap-0.9.15-sources.jar shared-...

    guice-3.0-API文档-中英对照版.zip

    赠送jar包:guice-3.0.jar; 赠送原API文档:guice-3.0-javadoc.jar; 赠送源代码:guice-3.0-sources.jar; 赠送Maven依赖信息文件:guice-3.0.pom; 包含翻译后的API文档:guice-3.0-javadoc-API文档-中文(简体)-...

    guice-multibindings-3.0-API文档-中文版.zip

    赠送jar包:guice-multibindings-3.0.jar; 赠送原API文档:guice-multibindings-3.0-javadoc.jar; 赠送源代码:guice-multibindings-3.0-sources.jar; 赠送Maven依赖信息文件:guice-multibindings-3.0.pom; ...

    Guice用户中文指南

    Guice用户中文指南,Guice (读作"juice")是超轻量级的,下一代的,为Java 5及后续版本设计的依赖注入容器

    Guice_1.0_Manual.pdf

    Guice开发手册, Guice中文开发手册

    guice-3.0-API文档-中文版.zip

    赠送jar包:guice-3.0.jar; 赠送原API文档:guice-3.0-javadoc.jar; 赠送源代码:guice-3.0-sources.jar; 赠送Maven依赖信息文件:guice-3.0.pom; 包含翻译后的API文档:guice-3.0-javadoc-API文档-中文(简体)版...

    google guice 3.0源码

    google guice 3.0源码,官方下载,帮助你更好理解google guice实现的原理

    guice-3.0.rar

    guice-3.0,轻量级IOC容器,包含guice-3.0.jar、guice-spring-3.0.jar、guice-struts2-plugin-3.0.jar

Global site tag (gtag.js) - Google Analytics