超轻量级DI容器框架Google Guice与Spring框架的区别
当前位置:以往代写 > JAVA 教程 >超轻量级DI容器框架Google Guice与Spring框架的区别
2019-06-14

超轻量级DI容器框架Google Guice与Spring框架的区别

超轻量级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的比拟

超轻量级DI容器框架Google Guice与Spring框架的区别

#p#副标题#e#

再借斧子的例子说一说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

    关键字:

在线提交作业