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();
}
}
分享到:
相关推荐
guice-2.0.jar guice-2.0.jar
采用的框架是struts2.1.8,ibatis3,guice2.0,完整的产品模块和权限模块(部分功能)例子。这是smeite.com商城第一版本的部分代码,测试通过。 希望给需要的朋友一个借鉴。 自我认为是学习Ibatis3比较好的例子,覆盖...
轻量级的Guice2.0代替了Spring,速度更快,项目体积更小,Hibernate3.2与JPA的结合使用代替了传统的配置文件,使Hibernate的开发更简单,本项目基本上是零配置开发,由于我只能上传小于15M的文件,故JAR被我删除了,...
`guice-2.0-no_aop.jar`是Guice的一个版本,不包含Aspect Oriented Programming(AOP)支持,这可能是因为在Android环境中,AOP的使用可能会增加复杂性和性能开销。 接下来,我们来看RoboGuice。RoboGuice是Guice的...
guice-2.0-no_aop.jar
这些库提供了Guice的基本功能和扩展特性,如Assisted Injection,用于创建具有部分构造函数参数的复杂对象。 总结来说,这个基于Guice的HelloWorld项目旨在演示如何使用Guice框架进行依赖注入,以实现代码的松耦合...
Guice-2.0版本是Guice框架的一个早期版本,相比于现在的4.x版本,可能缺少一些特性,比如更多的范围选项、更完善的异常处理等。但是,即便是早期版本,Guice-2.0也已经提供了基本的依赖注入功能,足够应对许多中小...
### Java Guice 依赖注入教程 #### 概述 本文档详细介绍如何利用 Google 开源的依赖注入框架 Guice 进行 Java 开发...随着 Guice 2.0 的推出,开发者将能够体验到更多的新功能和改进,进一步提升开发效率和代码质量。
guice.jar guice.jar guice.jar guice.jar guice.jar guice.jar guice.jar
(1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以...
- **现代化**:Guice充分拥抱了Java语言的新特性,如注解驱动的依赖注入。 - **适用场景**: - **Web应用开发**:可以与Struts 2或Wicket等流行框架结合使用。 - **企业级应用**:适用于大型、复杂的系统。 - *...
Guice,全称为Google Guice,是一款轻量级的依赖注入框架,由Google开发并开源。依赖注入(Dependency Injection,DI)是一种设计模式,它帮助我们解耦代码,提高组件的可测试性和可维护性。Guice通过在运行时自动...
5. **强大的社区支持**:由于其开源特性,Guice拥有一个活跃的社区,提供了丰富的资源和支持。 #### 三、示例解析 在给定的部分内容中,首先介绍了一个简单的服务接口`Service`及其两个实现类:`ServiceImpl`和`...
Guice 是 Google 推出的一款轻量级的依赖注入框架,专为 Java 5 及其后续版本设计。依赖注入(Dependency Injection,简称 DI)是一种设计模式,它允许开发者在不直接创建对象的情况下,将依赖关系从代码中解耦出来...
Guice 3.0是其一个重要的版本,提供了许多改进和新特性。 在Guice 3.0源码中,我们可以深入学习以下几个关键知识点: 1. **依赖注入(Dependency Injection)**:Guice的核心概念是依赖注入,它允许我们声明所需的...
MyBatis-Guice 3.6 是一个集成框架,它是MyBatis——一个流行的Java持久层框架——与Google的Guice依赖注入框架的完美结合。这个版本的MyBatis-Guice旨在简化MyBatis的配置过程,通过Guice的自动装配特性,帮助...
1. **定义接口**:首先定义一个`Service`接口,代表一种通用的服务功能。 2. **实现接口**:接着,实现`Service`接口的两个版本——`ServiceImpl`作为默认实现,`MockService`用于单元测试。 3. **传统工厂模式...
Google Guice和Spring都是流行的Java平台上的DI框架,但它们在实现方式、功能特性和使用场景上有所不同。 **描述解析:** "DI容器,例如spring,picoContainer,EJB容器等等 与Guice的不同" 这里提到了更多的DI...
在Java Web开发中,Jersey是一个流行的RESTful服务实现框架,而Guice是Google提供的一个轻量级依赖注入(DI)容器。这篇笔记将深入探讨如何将这两个强大的工具集成为一体,以优化项目架构和提高代码可维护性。 **一...
这种集成允许开发者利用 Guice 的强大特性来配置和管理 Shiro 组件,从而简化了安全层的实现。集成的主要目标是通过标准的 Guice 规范和机制来设置 Shiro 的核心组件,如 SecurityManager、Realm 等,并且支持 Web ...