Google Guice 之绑定1

绑定和依赖注入区别

绑定,使用时 需要通过 injector 显示获取

依赖注入,只需要显示获取主类,他的依赖是通过@Injector 和 绑定关系 隐式注入的

http://blog.csdn.net/jing_le/article/category/1403309

http://blog.csdn.net/java_le/article/details/24850355

  1. Injector in = Guice.createInjector(new MyModule()) ;  
  2.           
  3.         Hello hello = in.getInstance(Hello.class)

Google Guice 绑定2

http://blog.csdn.net/java_le/article/details/24850777

上一章简单介绍了,如何使用Guice框架来完成接口(父类)和具体的实现类(子类)之间的关联。通过MyModule中:

binder.bind(Hello.class).to(HelloImpl.class).in(Singleton.class) ;

来实现关联关系,这节介绍通过注解来实现关联关系

(1)首先还是Hello.java接口(注意类头上的注解,描述了这个接口要绑定的实现类)

  1. @ImplementedBy(HelloImpl.class)  
  2. public interface Hello {  
  3.       
  4.     void sayHello() ;  
  5. }  

Hello.java这个接口的具体实现类:HelloImpl.java(类头上的注解,这类是单列还是动态创建)

  1. @Singleton  
  2. public class HelloImpl implements Hello{  
  3.   
  4.     @Override  
  5.     public void sayHello() {  
  6.         System.out.println("HelloImpl say hello");  
  7.     }  
  8. }

我们的MyModule实现类(具体的绑定关系被注释了)

[java] view plain copy
 
  1. package guice.binder;  
  2.   
  3. import com.google.inject.Binder;  
  4. import com.google.inject.Module;  
  5.   
  6. public class MyModule implements Module{  
  7.   
  8.     @Override  
  9.     public void configure(Binder binder) {  
  10.         //将借口hello.java 绑定到实现类HelloImpl.java上  
  11.         //Singleton:表示是scope是单列的,Guice中类的scope只有两类,单例,或者每次都是new的一个新的对象  
  12. //<span style="white-space:pre">        </span>binder.bind(Hello.class).to(HelloImpl.class).in(Singleton.class) ;  
  13.     }  
  14.   
  15. }  
  1. Injector in = Guice.createInjector(new MyModule()) ;  
  2.           
  3.         Hello hello = in.getInstance(Hello.class) ;//hello -->HelloImpl实例  

输出的结果依然还是HelloImpl say hello,

Google Guice 注入(@Inject注解)

上一节介绍通过注解来实现绑定关系,这一节介绍如何通过@Inject来完成依赖注入的功能:

(1)属性注入

(2)构造方法注入

(3)setter方法注入

一.属性注入

(1)创建一个接口Hello.java和一个实现类HelloImpl

创建一个HelloCaller(包含一个Hello属性)

[java] view plain copy
 
  1. package guice.di;  
  2.   
  3. import com.google.inject.Inject;  
  4.   
  5. //HelloCaller将会去调用Hello这个接口提供的服务  
  6. public class HelloCaller {  
  7.       
  8.     //通过@Inject,来完成属性的注入  
  9.     @Inject  
  10.     private Hello hello ;  
  11.     //调用Hello的sayHello方法(实际上就是去调用HelloImpl的sayHello,因为我们将Hello的实现指定是HelloImpl)  
  12.     public void sayHello(){  
  13.         hello.sayHello() ;  
  14.     }  
  15. }  

通过@Inject注解将Hello属性的实例注入进来

  1. Injector in = Guice.createInjector(new Module(){  
  2.             @Override  
  3.             public void configure(Binder arg0) {  
  4.                 //什么也不写  
  5.             }  
  6.         }) ;  
  7.         //得到HelloCaller的实例  
  8.         HelloCaller helloCaller = in.getInstance(HelloCaller.class) ;  
  9.         //调用sayHello方法  
  10.         helloCaller.sayHello() ;  

构造方法注入

(1)Hello和HelloImpl类还是上面那样不用变,唯一变化的是HelloCaller类

[java] view plain copy
 
  1. package guice.di;  
  2.   
  3. import com.google.inject.Inject;  
  4.   
  5. public class HelloCaller1 {  
  6.     //包含一个Hello属性  
  7.     private Hello hello ;  
  8.     //@Inject注解写在构造方法上,通过构造方法的方式注入属性hello  
  9.     @Inject  
  10.     public HelloCaller1(Hello hello){  
  11.         this.hello = hello ;  
  12.     }  
  13.       
  14.     public void sayHello(){  
  15.         hello.sayHello() ;  
  16.     }  
  17. }  

setter方式注入

(1)Hello和HelloImpl类还是上面那样不用变,唯一变化的是HelloCaller类

  1. //通过setter方法来注入hello属性  
  2. @Inject  
  3. public void setHello(Hello hello) {  
  4. this.hello = hello;  
原文地址:https://www.cnblogs.com/ydxblog/p/7891262.html