超轻量级DI容器框架Google Guice与Spring框架的区别2015-02-06依赖注入,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!