超轻量级DI容器框架Google Guice与Spring框架的区别
副标题#e#
依赖注入,DI(Dependency Injection),它的浸染自然不必多说,提及DI容器,譬喻spring,picoContainer,EJB容器等等,克日,google降生了更轻巧的DI容器……Guice!
空话不多讲了,先看看Guice是如何实现注入的吧。
界说一个简朴的service接口和它的实现吧:
package com.zuidaima.demo.guice; public interface MyService ... { void myMethod(); }
package com.zuidaima.demo.guice; public class MyServiceImpl implements MyService ... { public void myMethod() ...{ System.out.println("Hello,World!"); } }
以上是最普通的接口和其实现,没什么可说的。
界说一个测试类,这个类里边包罗service工具的一个引用,这个工具是需要Guice举办注入的
package com.zuidaima.demo.guice; import com.google.inject.Inject; public class Client ... { MyService service; @Inject //汇报容器,这里的service工具的引用,需要举办注入 void setService(MyService service) ...{ //这里的要领名字可以任意界说 this.service=service; } public void myMethod() ...{ service.myMethod(); } }
这里除了加了一个@Inject,和Spring的设置没有任何的区别,@Inject,是暗示对容器说,这里的service需要打针,比及运行的时候,容器会拿来一个实例给service,完成打针的进程。
界说Guice的Module文件 汇报容器如何举办注入
package com.zuidaima.demo.guice; import com.google.inject.Binder; import com.google.inject.Module; import com.google.inject.Scopes; public class MyModule implements Module ... { public void configure(Binder binder) ...{ binder.bind(MyService.class).to(MyServiceImpl.class).in(Scopes.SINGLETON); // 这句代码的意思是说:运行时动态的将MyServiceImpl工具赋给MyService界说的工具,并且这个工具是单例的。 } }
建设测试类
package com.zuidaima.demo.guice; import com.google.inject.Guice; import com.google.inject.Injector; public class Test ... { public static void main(String[] args) ...{ MyModule module=new MyModule();// 界说打针法则 Injector injector=Guice.createInjector(module);// 按照打针法则,生成打针者 Client client=new Client(); injector.injectMembers(client);// 打针者将需要打针的bean,凭据法则,把client这个客户端举办打针 client.myMethod(); } }
运行测试类,节制台输出:Hello,World!
#p#副标题#e#
完成注入进程
下面看看Guice尚有哪些其它的利用特性。
1,假如在实现你确定MyService界说的工具,就要被打针为MyServiceImpl而不是其它的实现类的话,可以在MyService接口加上@ImplementedBy(MyServiceImpl.class)
package com.zuidaima.demo.guice; import com.google.inject.ImplementedBy; @ImplementedBy(MyServiceImpl. class ) // 我总以为这样有点背离了依赖注入的初志了 public interface MyService ... { void myMethod(); }
这样的话,在MyModule里的configure要领中就可以不加任何对象,容器就会自动打针给MyServiceImpl工具。
2,可以对Field举办注解式注入
在Client.java中也可以把这个@Inject标注在MyService service;的前边,如:@Inject MyService service;
3,可利用自界说Annotation标注。
package com.zuidaima.demo.guice; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import com.google.inject.BindingAnnotation; @Retention(RetentionPolicy.RUNTIME) @Target( ... { ElementType.FIELD, ElementType.PARAMETER }) @BindingAnnotation public @ interface MyInterface ... { }
那么Client.java需要改为
package com.zuidaima.demo.guice; import com.google.inject.Inject; public class Client ... { @Inject @MyInterface MyService service; void setService(MyService service) ...{ // 这里的要领名字可以任意界说 this.service=service; } public void myMethod() ...{ service.myMethod(); } }
MyModule.java中的configure要领内容需改为:
binder.bind(MyService.class).annotatedWith(MyInterface.class).to(
MyServiceImpl.class).in(Scopes.SINGLETON);
意思是说对付标注为MyInterface的MyService界说的工具举办注入
举办Annotation标注的成员(Field,method,argument等)举办自界说Annotation标注,该成员既拥有该属性,可以在运行,按照这些成员的差异属性,做一些差异的工作 譬喻:spring的AspectJ,xdoclet等都是如此。
下边是我做了一下比拟
Guice与Spring的比拟
再借斧子的例子说一说spring与guice的区别
看下边对付差异社会形态下一小我私家(java工具,挪用者)需要一把斧子(java工具,被挪用者)的例子:
#p#分页标题#e#
(1),原始社会时,劳动社会根基没有分工,需要斧子的人(挪用者)只好本身去磨一把斧子,每小我私家拥有本身的斧子,假如把各人的石斧改为铁斧,需要每小我私家都要学会磨铁斧的本事,事情效率极低。
对应Java里的景象是:java措施里的挪用者new一个被挪用者的实例。类耦合度极高,修改维护啰嗦,效率极低。
(2),家产社会时,工场呈现,斧子不再由普通人完成,而由工场出产,当人们需要斧子的时候,可以到工场购置斧子,无需体贴斧子是怎么制造出来的,假如废弃铁斧为钢斧,只需改变工场的制造工艺即可,建造工艺是工场抉择的,工场出产什么斧子,工人们就得用什么斧子。
对应的Java里的景象是:Java措施的挪用者可以以来简朴工场建设被挪用者,变革点被断绝到了简朴工场里,固然耦合度低落,可是挪用者会和工场耦合,并且需要定位本身的工场。
(3)近代家产社会,工场发达成长,人们需要什么斧子,只需要提供一个斧子图形,商家会凭据你提供的图形将你的斧子订做好,奉上门。
对应Java里的景象:spring的依赖注入
(4)进入按需要分派社会,信息进入现代化,人们不再去工场购置斧子,不再拘泥于需要什么斧子事先画好什么样的图形,只需要打个电话,描写一下需要什么范例的斧子,或者想打造一个物美价廉的斧子,商家会按照市场零件的价值,计较出最优建造工艺,打造最适合的斧子送过来,越发信息化,越发人性化。
对应Java里的景象:基于描写的注入,动态的,机动简朴的注入,如:Guice。
对付该不应利用Guice,我想也是仁者见仁,智者见智,就象许多几何论坛里动不动有人会在哪里接头到底学Java照旧学.net可能是利用eclipse照旧Jbuilder的这类无聊话题,适合和满意项目需求的,又能省工省力简朴的完成事情的,就是最好的。
在此抛砖引玉,各人有异议的处所接待和我接头。
代码下载地点:http://www.zuidaima.com/share/1759689106541568.htm