- 浏览: 172418 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (72)
- java (21)
- spring (3)
- struts2 (0)
- hibernate (0)
- sql (3)
- linux (20)
- java web (2)
- maven (1)
- cache (2)
- memcached api (1)
- 简化jdbc操作数据库 (2)
- JAVA 网络编程 (3)
- JAVA 多线程 (0)
- C&C++ (1)
- plsql (1)
- SVN常用命 (2)
- Hadoop2 (0)
- jvm (0)
- flex (0)
- html5 & css3 & ECMAscript (0)
- RFC 文档翻译 (0)
- http (0)
- Hadoop (1)
- android (0)
- BIG_DATA (2)
- v (0)
- linux php tomcat tengine (1)
最新评论
-
yuanliangding:
没整理。文章还有重复的部分。
Java虚拟机(JVM)中的内存设置详解 -
svsecomm:
...
转javassist用法 -
svsecomm:
[u][/u]
转javassist用法 -
hvang1988:
用惯了spirng,Guice的注解方式真有点不习惯反向的感 ...
Google Guice 5 web -
xaocaotanghui:
Java虚拟机(JVM)中的内存设置详解
1. 依赖注入
1.1 类依赖注入
所谓的绑定就是将一个接口绑定到具体的类中,这样客户端不用关心具体的实现,而只需要获取相应的接口完成其服务即可。
HelloWorld.java
2
3 String sayHello();
4 }
5
然后是具体的实现,HelloWorldImpl.java
2
3 @Override
4 public String sayHello() {
5 return "Hello, world!";
6 }
7 }
8
写一个测试例子看看,HelleWorldTest.java
2
3 @Test
4 public void testSayHello() {
5 Injector inj= Guice.createInjector(new Module() {
6 @Override
7 public void configure(Binder binder) {
8 binder.bind(HelloWorld.class).to(HelloWorldImpl.class);
9 }
10 });
11 HelloWorld hw = inj.getInstance(HelloWorld.class);
12 Assert.assertEquals(hw.sayHello(), "Hello, world!");
13 }
14 }
15
这个例子非常简单,通俗的将就是将一个HelloWorldImpl的实例与HelloWorld关联起来,当想Guice获取一个HelloWorld实例的时候,Guice就返回一个HelloWorldImpl的实例,然后我们就可以调用HelloWorld服务的方法了。
问题(1)HelloWorld是单例的么?测试下。
2 Assert.assertEquals(hw.sayHello(), "Hello, world!");
3 HelloWorld hw2 = inj.getInstance(HelloWorld.class);
4 System.out.println(hw.hashCode()+"->"+hw2.hashCode());
5 Assert.assertEquals(hw.hashCode(), hw2.hashCode());
解答(1)测试结果告诉我们,HelloWorld不是单例的,每次都会返回一个新的实例。
问题(2)HelloWorld的实例是HelloWorldImpl么?可以强制转型么?
HelloWorld hw = inj.getInstance(HelloWorld.class);
System.out.println(hw.getClass().getName());
解答(2),结果输出cn.imxylz.study.guice.helloworld.HelloWorldImpl,看来确实只是返回了一个正常的实例,并没有做过多的转换和代理。
问题(3),如果绑定多个实现到同一个接口上会出现什么情况?
2 @Override
3 public String sayHello() {
4 return "Hello world again.";
5 }
6 }
binder.bind(HelloWorld.class).to(HelloWorldImplAgain.class);
解答(3),很不幸,Guice目前看起来不允许多个实例绑定到同一个接口上了。
com.google.inject.CreationException: Guice creation errors:
1) A binding to cn.imxylz.study.guice.helloworld.HelloWorld was already configured at cn.imxylz.study.guice.helloworld.HelleWorldTest$1.configure(HelleWorldTest.java:28).
at cn.imxylz.study.guice.helloworld.HelleWorldTest$1.configure(HelleWorldTest.java:29)
问题(4),可以绑定一个实现类到实现类么?
1 Injector inj= Guice.createInjector(new Module() {
2 @Override
3 public void configure(Binder binder) {
4 binder.bind(HelloWorldImpl.class).to(HelloWorldImpl.class);
5 }
6 });
7 HelloWorld hw = inj.getInstance(HelloWorldImpl.class);
8 System.out.println(hw.sayHello());
非常不幸,不可以自己绑定到自己。
1) Binding points to itself.
at cn.imxylz.study.guice.helloworld.HelleWorldTest$1.configure(HelleWorldTest.java:28)
我们来看看bind的语法。
也就是说只能绑定一个类的子类到其本身。改造下,改用子类替代。
2
3 @Override
4 public String sayHello() {
5 return "@HelloWorldSubImpl";
6 }
7 }
8
2 @Override
3 public void configure(Binder binder) {
4 binder.bind(HelloWorldImpl.class).to(HelloWorldSubImpl.class);
5 }
6 });
7 HelloWorldImpl hw = inj.getInstance(HelloWorldImpl.class);
8 System.out.println(hw.sayHello());
太好了,支持子类绑定,这样即使我们将一个实现类发布出去了(尽管不推荐这么做),我们在后期仍然有办法替换实现类。
使用bind有一个好处,由于JAVA 5以上的泛型在编译器就确定了,所以可以帮我们检测出绑定错误的问题,而这个在配置文件中是无法检测出来的。
这样看起来Module像是一个Map,根据一个Key获取其Value,非常简单的逻辑。
问题(5),可以绑定到我们自己构造出来的实例么?
解答(5)当然可以!看下面的例子。
2 @Override
3 public void configure(Binder binder) {
4 binder.bind(HelloWorld.class).toInstance(new HelloWorldImpl());
5 }
6 });
7 HelloWorld hw = inj.getInstance(HelloWorld.class);
8 System.out.println(hw.sayHello());
问题(6),我不想自己提供逻辑来构造一个对象可以么?
解答(6),可以Guice提供了一个方式(Provider<T>),允许自己提供构造对象的方式。
2 @Override
3 public void configure(Binder binder) {
4 binder.bind(HelloWorld.class).toProvider(new Provider<HelloWorld>() {
5 @Override
6 public HelloWorld get() {
7 return new HelloWorldImpl();
8 }
9 });
10 }
11 });
12 HelloWorld hw = inj.getInstance(HelloWorld.class);
13 System.out.println(hw.sayHello());
问题(7),实现类可以不经过绑定就获取么?比如我想获取HelloWorldImpl的实例而不通过Module绑定么?
解答(7),可以,实际上Guice能够自动寻找实现类。
HelloWorld hw = inj.getInstance(HelloWorldImpl.class);
System.out.println(hw.sayHello());
问题(8),可以使用注解方式完成注入么?不想手动关联实现类。
解答(8),好,Guice提供了注解的方式完成关联。我们需要在接口上指明此接口被哪个实现类关联了。
2 public interface HelloWorld {
3
4 String sayHello();
5 }
6
HelloWorld hw = inj.getInstance(HelloWorld.class);
System.out.println(hw.sayHello());
事实上对于一个已经被注解的接口我们仍然可以使用Module来关联,这样获取的实例将是Module关联的实例,而不是@ImplementedBy注解关联的实例。这样仍然遵循一个原则,手动优于自动。
问题(9)再回头看问题(1)怎么绑定一个单例?
1 Injector inj = Guice.createInjector(new Module() {
2
3 @Override
4 public void configure(Binder binder) {
5 binder.bind(HelloWorld.class).to(HelloWorldImplAgain.class).in(Scopes.SINGLETON);
6 }
7 });
8 HelloWorld hw = inj.getInstance(HelloWorld.class);
9 HelloWorld hw2 = inj.getInstance(HelloWorld.class);
10 System.out.println(hw.hashCode() + "->" + hw2.hashCode());
11
可以看到现在获取的实例已经是单例的,不再每次请求生成一个新的实例。事实上Guice提供两种Scope,com.google.inject.Scopes.SINGLETON和com.google.inject.Scopes.NO_SCOPE,所谓没有scope即是每次生成一个新的实例。
对于自动注入就非常简单了,只需要在实现类加一个Singleton注解即可。
附:【前沿】本教程的依赖注入部分基于老菜鸟叮咚的教程,原文在此http://www.family168.com/tutorial/guice/html/。原文主要基于Google Guice 1.0版本的,本文基于Google Guice 2.0版本进行学习和讨论。1 @Singleton
2 public class HelloWorldImpl implements HelloWorld {
3
4 @Override
5 public String sayHello() {
6 return "Hello, world!";
7 }
8 }
9
发表评论
-
java annotation
2013-10-19 14:27 712元数据的作用 如果要对于元数据的作用进行分类,目前还没有明 ... -
sun directory server
2013-10-17 14:07 736Sun One Directory Server(LDAP) ... -
sun ldap
2013-10-16 16:07 413LDAP快速入门 1. LDAP简介 LDAP(轻 ... -
httpclient 上传文件客户端处理
2013-10-07 11:09 897/** * */package cn.vwall.playe ... -
httpclient 上传文件 服务端解析
2013-10-07 11:07 848//commons-fileupload.jar common ... -
ffmpeg 视频加水印
2013-09-02 14:22 8271ffmpeg为视频添加水印watermark【转加补充】 ... -
ffmpeg args
2013-08-25 02:17 937先从Mencoder这个开始,将所有格式转AVI, RM ... -
socket 2
2013-06-11 20:57 974二、用于获得和设置Socket选项的getter和sette ... -
StringUtils
2012-12-31 01:45 1742StringUtils详细介绍 public stat ... -
转javassist用法
2012-10-15 17:15 13371Javassist是一个执行字 ... -
转 Quartz Cron
2012-10-02 10:28 1120Cron表达式 Quartz使用类似于Linux下的Cr ... -
apache db
2012-05-23 16:15 937queryRunner 摘抄 查询 runner ... -
Excel 色表
2012-05-11 16:09 1213按颜色菜单的色块位置排列 第1列 第2列 ... -
Google Guice 5 web
2012-05-11 16:09 31913 Web 和 Servlet 3.1 快速开始 我 ... -
Google Guice 5 aop
2012-05-02 23:06 15502 AOP 面向切面编程 2.1 AOP入门 在前面 ... -
Google Guice 4
2012-05-02 23:00 1893本章节继续讨论依赖注入的其他话题,包括作用域(scope ... -
Google Guice 3
2012-05-02 22:43 15491.3 更多话题 1.3.1 接口多实现 如果一个接 ... -
Google Guice 2
2012-05-02 22:30 11301.2 属性注入(Field Inject) 1.2. ... -
Java虚拟机(JVM)中的内存设置详解
2012-04-13 17:03 32769Java虚拟机(JVM)中的内存设置详解 在一些 ... -
hashCode、hashCode()与HashSet集合
2011-09-09 14:02 1030hashCode、hashCode()与HashSet集合 ...
相关推荐
Google Guice 这个高效的与Spring类似的依赖注入框架; MyBatis配置和使用; Google Guice与MyBatis集成,支持注解事务,简单的无法想象; Mybatis与mysql集成;实现发送邮件轮询; 源码是个web项目,里面有数据库的...
google guice 3.0源码,官方下载,帮助你更好理解google guice实现的原理
用 Guice 写 Java Guice 1.0 用户指南 王咏刚 译 Guice (读作"juice")是超轻量级的,下一代的,为Java 5及后续版本设计的依赖注入容器。
Guice是Google开发的一个轻量级,基于Java5(主要运用泛型与注释特性)的依赖注入框架(IOC)。Guice非常小而且快。Guice是类型安全的,它能够对构造函数,属性,方法(包含任意个参数的任意方法,而不仅仅是setter...
Google Guice: Agile Lightweight Dependency Injection Framework will not only tell you "how," it will also tell you "why" and "why not," so that all the knowledge you gain will be as widely applicable ...
谷歌Guice开发英文文档,很详细,对开发很有帮助,可当成工具书使用!
Google Guice需要的jar包: Guice-3.0.jar javax.inject.jar
google-guice用户手册,据说和spring pk
DI容器,例如spring,picoContainer,EJB容器等等 与Guice的不同
NULL 博文链接:https://m635674608.iteye.com/blog/2090042
博文链接:https://avengerbevis.iteye.com/blog/69237
用户指南 博文链接:https://hejianjie.iteye.com/blog/83374
Guice (读作"juice")是超轻量级的,下一代的,为Java 5及后续版本设计的依赖注入容器。 <br>
标签:google、inject、guice、jar包、java、API文档、中英对照版; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准...
Guice中文文档,介绍Guice的基本使用,适合初学者。
标签:google、inject、extensions、guice、multibindings、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变...
标签:google、inject、guice、jar包、java、中文文档; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请...
该项目包含一组Google Guice扩展程序,可用于开发中。 符合OSGi: 生成状态: 问题: : //github.com/mycila/license-maven-plugin/issues 许可证: Apache License 2.0 贡献者 @mgoellnitz @keeganwitt ...
标签:google、inject、guice、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请...