该帖已经被评为隐藏帖
|
|
---|---|
作者 | 正文 |
发表时间:2007-04-02
初次认识Guice 从网站上看到了有人提起这个框架——Guice,google名下的产物——一个彼Spring快的DI容器,兴趣使然,马上到http://code.google.com/p/google-guice/上去看了看,发现居然是Bob Lee这位大仙的杰作,还犹豫什么,download下来试试! 恩,从哪里试起呢?还是老规矩,碰到新的东西就来验证我们经典的例子——Hello World! 这个东西说是DI,居然没有.xml或者.properties文件,老天它用的是该死的Annotation,很好,要是大家也想尝试的话统统5.0或者以上的干活。安装好环境,开始动手!可是从哪里开始呢?既然说是DI容器,那好,我们先把我们的程序准备好,然后再看它把各个需要的东西怎么Inject。 借鉴一下Spring开发手册里的例子吧,稍微改改(无聊的人不要骂这个程序,因为它太简单,我都想骂!)。既然是要打印,我们先来一个打印的服务接口: public interface PrintService { public void print(String str); } 很好,再来一个它的实现: public class PrintServiceImpl implements PrintService { public void print(String str) { System.out.print(str); } } 然后呢?一个打印客户Client: public class Client { private String str="Hello world"; private PrintService service; void printString() { service.print(str); } } 看到了么?这次Inject的不是那个该死的字符串“Hello World”,而是该死的打印服务!好了,Client和我们的打印服务是分开的,我不知道Guice会怎么把打印服务在Client需要的时候Inject进来。不管怎么做,一个test是应该有的: import junit.framework.TestCase; public class testClient extends TestCase { public void testPrintString() { Client client=new Client(); client.printString(); } } 好了,试试看,应该是红色的条子。废话,Client在这里根本不知道该死的打印服务在哪里。那么寻找打印服务就是Guice的事情了。 让我们看看Guice是怎么进行Inject的。我们想要Client在使用的时候找到打印服务,那么我们应该在Client需要的时候将其Inject进去,这样的话我们需要写一个类似于setter的东西来建造一个Inject点,那么我们在Client里添加些东西: import com.google.inject.Inject; public class Client { private String str="Hello world"; private PrintService service; @Inject void injectPrintService(PrintService service) { this.service=service; } void printString() { service.print(str); } } 我们写入了一个injectPrintService方法,这个方法可以充当Inject点,然后我们在这个方法上面来一个Annotation——“@Inject”,这就是告诉Guice应该在哪里Inject我们需要的打印服务。 好了,我们下面要做的就是把PrintService和我们的实现动态的绑定起来(接口编程,好主意)。在Guice里,我们需要实现一个叫做Module的接口,Guice将一个binder传递给你的Module,然后你的Module将接口和它的实现绑定起来。让我们来试一下: import com.google.inject.Binder; import com.google.inject.Module; public class MyModule implements Module { public void configure(Binder binder) { binder.bind(PrintService.class).to(PrintServiceImpl.class); } } 在我们需要打印服务的时候,Guice会自动创建一个PrintServiceImpl的实例给我们。OK,接下来就是如何注入的问题了,我们需要在test中实现: import junit.framework.TestCase; import com.google.inject.*; public class testClient extends TestCase { public void testPrintString() { MyModule mo=new MyModule(); Injector in=Guice.createInjector(mo); Client client=new Client(); in.injectMembers(client); client.printString(); } } 完了!一个全新的Hello world将要被打印出来了。 Guice的工作流程是这样的: 首先将自己创建的Module传给Guice.createInjector(),Guice会为你的Module创建一个binder,你的Module利用这个binder来实现各种绑定,然后在Guice会创建一个Injector出来,我们就可以利用这个Injector来Inject我们的服务了。 Guice将DI这个概念完完全全的诠释了出来,使我们在编写的应用的时候不必去考虑具体的实现在哪里,Guice会为你动态的绑定并且Inject的。很好使的框架,很有意思,以后继续关注!! Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1523733 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-04-02
我是看好Guice的。spring是“无所不能”的,而Guice是一个很好的IOC容器。在某种情况下Guice是spring的一种很好的替代。
仿佛当年spring“轻量级”于Ejb,如今Guice又“轻量级”于spring。 欢迎大家讨论。 |
|
返回顶楼 | |
发表时间:2007-04-02
MyModule不是要自己写么?
|
|
返回顶楼 | |
发表时间:2007-04-02
Guice可能有很好的发展,但现在明显不成熟
|
|
返回顶楼 | |
发表时间:2007-04-02
什么都用annotation有时候也不是很方便吧,修改起来是不是也要麻烦呢,至于速度,如果真能比spring快一百倍的话,那以后肯定是大有前途了
|
|
返回顶楼 | |
发表时间:2007-04-02
annotation代替xml,我不觉的Guice能跟spring竞争,使用Guice的annotation(比如@ImplementedBy)反而背离了依赖注入。
|
|
返回顶楼 | |
发表时间:2007-04-02
他的速度比spring快一百倍指的是什么速度?bean的组装速度?
|
|
返回顶楼 | |
发表时间:2007-04-02
应该是初始化的速度,spring解析xml。肯定要慢了。
Guice要自己写Module不觉得是更加的繁琐了么?如果真的采用他来替代spring的话,这个Module在什么地方写比较好? 举个例子,一个web应用的话,把这个Module写在Listener里面?然后写一大堆的bind? |
|
返回顶楼 | |
发表时间:2007-04-02
annotation代替xml,但,如果我一个项目中大量地使用annotation,当我修改的时候,不是又要一个类一个类地去修改?如果这样的话,是不是还没有基于xml更有优势?
|
|
返回顶楼 | |
发表时间:2007-04-02
java折腾折腾又回到原始社会了;(
|
|
返回顶楼 | |