Guice 依赖绑定

连接绑定(Linked Bingdings)

连接绑定是 Guice 最基本的一种绑定方式。这种绑定方式我们需要在自己定义的 Moduleconfigure() 中编写绑定。如下所示:

public class BillingModule extends AbstractModule {
@Override
protected void configure() {
bind(Animal.class).to(Cat.class);
}
}

现在当调用 injector.getInstance(Animal.class) 时,就会返回一个 Cat 对象。

连接绑定也可以组成链式,如下:

public class BillingModule extends AbstractModule {
@Override
protected void configure() {
bind(Animal.class).to(Cat.class);
bind(Cat.class).to(PersianCat.class);
}
}

此时

注解绑定(Binding Annotations)

某些时候我们的一个接口可能有很多的实现,而此时我们在代码的某个地方想让这个接口绑定其中的某体格实现,这个时候直接使用连接绑定就不行了。

此时我们可以使用注解(Annotation)来绑定,我们可以使用自己定义的注解,举例:

@BindingAnnotation
@Target({ FIELD, PARAMETER, METHOD })
@Retention(RUNTIME)
public @interface Persian {}

这个注解中需要主要的是 @BindingAnnotation 这个地方,这是由 Guice 提供的,来标识这个注解就是用来标识绑定的,我们也可以称其为绑定注解(Binging Annotation)。当一个对象被多个绑定注解所标识时,Guice 就会报错

@Inject
@Persian
private Cat cat;

我们仍然需要指定绑定关系,如下:

bind(Cat.class)
.annotatedWith(Persian.class)
.to(PersianCat.class);

其实,如果没有什么特殊需求的话,Guice 已经为我们提供了一种默认的注解来辅助我们进行对象绑定,@Named。仍然以上述例子来说明:

@Inject
@Named("persian")
private Cat cat;

此时绑定关系可以这样写:

bind(Cat.class)
.annotatedWith(Names.named("persian"))
.to(PersianCat.class);

实例绑定(Instance Bindings)

顾名思义,直接使用实例而来进行绑定。通常这种绑定作用于没有什么依赖和实现的对象上。

最普遍的应用大概就是一些参数变量的绑定了,直接 Copy 官方文档的代码:

bind(String.class)
.annotatedWith(Names.named("JDBC URL"))
.toInstance("jdbc:mysql://localhost/pizza");
bind(Integer.class)
.annotatedWith(Names.named("login timeout seconds"))
.toInstance(10);

如果实例过于复杂,就不要使用这样的方式绑定,因为这些代码写在 Moduleconfigure() 中,会拖慢程序的启动。稍后会说到,可以使用 @Provides 来代替。

@Provides 方法

当需要某种类型的对象时,就可以使用 @Provides 方法。这类方法必须定义在 Module 中,且用 @Provides 标识,如下:

public class AppModule extends AbstractModule {
protected void configure() {} @Provides
PersianCat providePersianCat() {
PersianCat persianCat = new PersianCat();
persianCat.setName("Foo");
return persianCat;
}
}

这时当注入 PersianCat 类型对象时,就会从 providePersianCat() 方法中生成。

@Provides 方法也可以添加注解,这里就直接贴官方代码了,不做赘述:

@Provides @PayPal
CreditCardProcessor providePayPalCreditCardProcessor(@Named("PayPal API key") String apiKey) {
PayPalCreditCardProcessor processor = new PayPalCreditCardProcessor();
processor.setApiKey(apiKey);
return processor;
}

Provider 绑定(Provider Bindings)

当使用了太多 @Provides 方法绑定之后,Module 就会显得臃肿不堪。这时可以试着将这些方法从 Module 中剥离出来,只要实现 Guice 提供的 Provider 的接口即可。

public interface Provider<T> {
T get();
}

Provider 接口只有一个 get() 方法,其实很简单。直接把上述代码移至此处。

public class PersianCatProvider implements Provider<PersianCat> {

    public PersianCat get() {
PersianCat persianCat = new PersianCat();
persianCat.setName("Foo");
return persianCat;
}
}

最后如果需要,可以指定类型绑定到 Provider:

bind(Cat.class).toProvider(PersianCatProvider.class);

构造方法绑定(Constructor Bindings)

有时候当绑定对象有多个构造方法时,我们可能需要指定某一个构造方法,这时可以使用构造方法绑定来达到目的。如下:

try {
bind(PersianCat.class).toConstructor(PersianCat.class.getConstructor(String.class));
} catch (NoSuchMethodException e) {
e.printStackTrace();
}

需要注意的是,这种绑定方式需要捕获异常。

@ImplementedBy 与 @ProvidedBy

@ImplementedBy 注解用于简化绑定配置,通常用于指定默认的实现类型。最常用的场景在于编写 Dao 或者 Service 时,指定 Interface 的实现类。直接给出官方示例:

@ImplementedBy(PayPalCreditCardProcessor.class)
public interface CreditCardProcessor {
ChargeResult charge(String amount, CreditCard creditCard) throws UnreachableException;
}

等价于:

bind(CreditCardProcessor.class).to(PayPalCreditCardProcessor.class);

@ProvidedBy 也是顾名思义:

@ProvidedBy(DatabaseTransactionLogProvider.class)
public interface TransactionLog {
void logConnectException(UnreachableException e);
void logChargeResult(ChargeResult result);
}

等价于

bind(TransactionLog.class).toProvider(DatabaseTransactionLogProvider.class);

Guice 依赖绑定的更多相关文章

  1. spring揭秘 读书笔记 二 BeanFactory的对象注册与依赖绑定

    本文是王福强所著<<spring揭秘>>一书的读书笔记 我们前面就说过,Spring的IoC容器时一个IoC Service Provider,而且IoC Service Pr ...

  2. Spring中BeanFactory的对象注册与依赖绑定方式

    概念 BeanFactory是spring的基础类型IOC容器,提供完整的IOC服务支持 默认采用延迟初始化策略,当客户端对象访问受管对象时,才对其进行初始化和依赖注入 理解 BeanFactory将 ...

  3. spring揭秘 读书笔记 二 BeanFactory的对象注冊与依赖绑定

    本文是王福强所著<<spring揭秘>>一书的读书笔记 我们前面就说过,Spring的IoC容器时一个IoC Service Provider,并且IoC Service Pr ...

  4. Google Guice 之绑定1

    绑定和依赖注入区别 绑定,使用时 需要通过 injector 显示获取 依赖注入,只需要显示获取主类,他的依赖是通过@Injector 和 绑定关系 隐式注入的 http://blog.csdn.ne ...

  5. Elasticsearch源码分析 | 单节点的启动和关闭

    本文主要简要介绍Elasticsearch单节点的启动和关闭流程.Elasticsearch版本:6.3.2 相关文章 1.Google Guice 快速入门 2.Elasticsearch 中的 G ...

  6. 【翻译】 Guice 动机——依赖注入的动机

    原文链接 动机 将所有的内容连接在一起时应用开发的一个单调乏味的部分.有几种方式来将数据.服务.presetntation类连接到一起.为了对比这些方法,我将为披萨订购网站编写账单代码: public ...

  7. java轻量级IOC框架Guice

    Google-Guice入门介绍(较为清晰的说明了流程):http://blog.csdn.net/derekjiang/article/details/7231490 使用Guice,需要添加第三方 ...

  8. Google Guice结合模式

    于Guice于,喷油器装配工作是一个对象图,当请求类型实例,喷油器根据推断对象如何映射到创建的实例.解决依赖.要确定如何解决的依赖就需要配置喷油器结合的方式. 要创建绑定(Binding)对象,能够继 ...

  9. google guice

    1 google guice是什么 google guice是一个轻量的DI容器. 2 guice和spring对比 spring的配置放在xm文件中,guice的配置放在Module中. guice ...

随机推荐

  1. Java IO笔记

    第一:File类(主要获取文件名,判断文件是否存在,创建或者删除文件) 举个例子,代码如下: import java.io.File; public class Main{ public static ...

  2. java keytool证书工具使用小结【转】

    java keytool证书工具使用小结 keytool导入导出多条目对比 在Security编程中,有几种典型的密码交换信息文件格式: DER-encoded certificate: .cer, ...

  3. matplotlib笔记——legend用法

    rates = [0.01, 0.001, 0.0001] models = {} costs = np.array([[0.7, 0.9, 0.4, 0.6, 0.4, 0.3, 0.2, 0.1] ...

  4. centos redis集群搭建

    说明: 10.0.0.111部署6500,6501,6502三个主节点 10.0.0.222部署6500,6501,6502三个备份节点 1.安装redis:略 2.配置内核参数 # 配置 vm.ov ...

  5. Java基础其他

    1. 二进制 进制就是进位制,常见的有二进制.十进制.十六进制等 在进制中,可用符号的数量称为基数,基数为n就称为n进制,逢n进一位: 二进制:0 1 十进制:0 1 2 3 4 5 6 7 8 9 ...

  6. pip 报错

    pip 安装 初始化系统 安装PiP 问题? 依赖包:yun install wget gcc gcc-c++ -y python 环境 wget http://www.python.org/ftp/ ...

  7. Java SE之String,字符串和子字符串的存储与区别

    理解String 是怎么占用内存的       来看一个每个String对象的各个属性,一个String包括如下的属性: 一个char数组(是个独立的对象用来存储字符串中的字符) 一个int 的off ...

  8. luogu P1486 [NOI2004]郁闷的出纳员

    一万年以后终于调过了这题 这道题主要是维护一个有序的集合(吧),所以使用平衡树(我这里用\(Splay\)) 记录一个变量\(ff\)(雾),表示所有工资的变化量 对于\(I\)操作,如果初始工资大于 ...

  9. 列式数据库~clickhouse 底层存储原理

    简介:今天介绍列式数据库的一些基本原理 一  数据目录 Data目录 数据存储目录,数据按照part分成多个文件夹,每个文件夹下存储相应数据和对应的元信息文件 Metadata 表定义语句,存储所有表 ...

  10. 给bootstrap table设置行列单元格样式

    1.根据单元格或者行内其他单元格的内容,给该单元格设置一定的css样式 columns: [{ field: 'index', title: '序号', align:"center" ...