Guice 依赖绑定
Guice 依赖绑定
连接绑定(Linked Bingdings)
连接绑定是 Guice 最基本的一种绑定方式。这种绑定方式我们需要在自己定义的 Module
的 configure()
中编写绑定。如下所示:
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);
如果实例过于复杂,就不要使用这样的方式绑定,因为这些代码写在 Module
的 configure()
中,会拖慢程序的启动。稍后会说到,可以使用 @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 依赖绑定的更多相关文章
- spring揭秘 读书笔记 二 BeanFactory的对象注册与依赖绑定
本文是王福强所著<<spring揭秘>>一书的读书笔记 我们前面就说过,Spring的IoC容器时一个IoC Service Provider,而且IoC Service Pr ...
- Spring中BeanFactory的对象注册与依赖绑定方式
概念 BeanFactory是spring的基础类型IOC容器,提供完整的IOC服务支持 默认采用延迟初始化策略,当客户端对象访问受管对象时,才对其进行初始化和依赖注入 理解 BeanFactory将 ...
- spring揭秘 读书笔记 二 BeanFactory的对象注冊与依赖绑定
本文是王福强所著<<spring揭秘>>一书的读书笔记 我们前面就说过,Spring的IoC容器时一个IoC Service Provider,并且IoC Service Pr ...
- Google Guice 之绑定1
绑定和依赖注入区别 绑定,使用时 需要通过 injector 显示获取 依赖注入,只需要显示获取主类,他的依赖是通过@Injector 和 绑定关系 隐式注入的 http://blog.csdn.ne ...
- Elasticsearch源码分析 | 单节点的启动和关闭
本文主要简要介绍Elasticsearch单节点的启动和关闭流程.Elasticsearch版本:6.3.2 相关文章 1.Google Guice 快速入门 2.Elasticsearch 中的 G ...
- 【翻译】 Guice 动机——依赖注入的动机
原文链接 动机 将所有的内容连接在一起时应用开发的一个单调乏味的部分.有几种方式来将数据.服务.presetntation类连接到一起.为了对比这些方法,我将为披萨订购网站编写账单代码: public ...
- java轻量级IOC框架Guice
Google-Guice入门介绍(较为清晰的说明了流程):http://blog.csdn.net/derekjiang/article/details/7231490 使用Guice,需要添加第三方 ...
- Google Guice结合模式
于Guice于,喷油器装配工作是一个对象图,当请求类型实例,喷油器根据推断对象如何映射到创建的实例.解决依赖.要确定如何解决的依赖就需要配置喷油器结合的方式. 要创建绑定(Binding)对象,能够继 ...
- google guice
1 google guice是什么 google guice是一个轻量的DI容器. 2 guice和spring对比 spring的配置放在xm文件中,guice的配置放在Module中. guice ...
随机推荐
- Java中Jdom解析XML
JDOM与DOM类似,也是一组用于解析XML的API,它本身不是一个解析器,默认的它内置了Apache的Xerces解析器:JDOM与DOM不同的是,DOM是跨语言的一套API,Java世界中有很多D ...
- 标准遗传算法(二进制编码 python实现)
代码地址:https://github.com/guojun007/binary_sga 种群初始化: binary_sga/population_init/population_init.py #种 ...
- Vue.js 开发环境的搭建
1. cnpm install vue-cli(安装vue 脚手架) 2. vue init webpack my-project(my-project:自定义,取一个项目的名字,init 初始化一个 ...
- JAVA记录-SpringMVC+Mybatis几个核心注意的地方
1.DispatcherServlet -- 前置控制器 DispatcherServlet是一个Servlet,所以可以配置多个DispatcherServlet. DispatcherServ ...
- PL/SQL可以连oracle,但是jdbc连不上 【转】
场景描述 此处是jdbc连接: try { Class.forName("oracle.jdbc.driver.OracleDriver"); String url = " ...
- UVALive - 7639 G - Extreme XOR Sum(思维)
题目链接 题意 给出一个序列,相邻两两异或,生成一个新序列,再相邻两两异或,直到只剩下一个元素,问最后结果为多少.m个查询,每次都有一个待查询区间. 分析 既然有多组查询,n只是1e4,那么可以考虑预 ...
- 【转载】掌握 HTTP 缓存——从请求到响应过程的一切(下)
作者:Ulrich Kautz 编译:胡子大哈 翻译原文:http://huziketang.com/blog/posts/detail?postId=58bd4dd1204d50674934c3b0 ...
- .Net进阶系列(13)-异步多线程(Task和Parallel)(被替换)
一. Task开启多线程的三种形式 1. 利用TaskFactory下的StartNew方法,向StartNew传递无参数的委托,或者是Action<object>委托. 2. 利用Tas ...
- 「About Blockchain(一)」达沃斯年会上的区块链
「About Blockchain(一)」 --达沃斯年会上的区块链 写在前面:1月23日到26日,在瑞士达沃斯召开了第48届世界经济论坛.这个新闻本没有引起我格外的关注,直到前两天张老师分享给我一篇 ...
- 2018-2019-2 网络对抗技术 20165230 Exp6 信息搜集与漏洞扫描
目录 1.实验内容 2.实验过程 任务一:各种搜索技巧的应用 通过搜索引擎进行信息搜集 搜索网址目录结构 使用IP路由侦查工具traceroute 搜索特定类型的文件 任务二:DNS IP注册信息的查 ...