zoukankan      html  css  js  c++  java
  • Guice 注入(@Inject注解)

    带有@Inject注解的类 使用 injector.getInstance初始化

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

    Google Guice 注入(@Inject注解)

    原创 2014年05月01日 22:52:16

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

    (1)属性注入

    (2)构造方法注入

    (3)setter方法注入

    一.属性注入

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

    [java] view plain copy
     
    1. package guice.di;  
    2.   
    3. import com.google.inject.ImplementedBy;  
    4. //将这个接口和实现类HelloImpl绑定到一起  
    5. @ImplementedBy(HelloImpl.class)  
    6. public interface Hello {  
    7.     void sayHello() ;  
    8. }  
    9.   
    10.   
    11. package guice.di;  
    12.   
    13. //这里没有加@Singleton,表示是动态创建这个类,不是单例的  
    14. public class HelloImpl implements Hello{  
    15.       
    16.     @Override  
    17.     public void sayHello() {  
    18.         System.out.println("HelloImpl Say Hello");  
    19.     }  
    20. }  

    通过@ImplementedBy注解,将接口和实现类绑定在一起

    (2)创建一个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属性的实例注入进来


    (3)创建一个测试类Client

    [java] view plain copy
     
    1. package guice.di;  
    2.   
    3. import com.google.inject.Binder;  
    4. import com.google.inject.Guice;  
    5. import com.google.inject.Injector;  
    6. import com.google.inject.Module;  
    7.   
    8. public class Client {  
    9.       
    10.     //创建一个测试程序  
    11.     public static void main(String[] args) {  
    12.           
    13.         Injector in = Guice.createInjector(new Module(){  
    14.             @Override  
    15.             public void configure(Binder arg0) {  
    16.                 //什么也不写  
    17.             }  
    18.         }) ;  
    19.         //得到HelloCaller的实例  
    20.         HelloCaller helloCaller = in.getInstance(HelloCaller.class) ;  
    21.         //调用sayHello方法  
    22.         helloCaller.sayHello() ;  
    23.     }  
    24.       
    25. }  

    结果:
    [java] view plain copy
     
    1. HelloImpl Say Hello  
    二. 构造方法注入

    (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. }  

    (2)创建测试程序
    [java] view plain copy
     
    1. package guice.di;  
    2.   
    3. import com.google.inject.Binder;  
    4. import com.google.inject.Guice;  
    5. import com.google.inject.Injector;  
    6. import com.google.inject.Module;  
    7.   
    8. public class Client {  
    9.       
    10.     //创建一个测试程序  
    11.     public static void main(String[] args) {  
    12.           
    13.         Injector in = Guice.createInjector(new Module(){  
    14.             @Override  
    15.             public void configure(Binder arg0) {  
    16.                 //什么也不写  
    17.             }  
    18.         }) ;  
    19.         //得到HelloCaller的实例  
    20.         HelloCaller1 helloCaller = in.getInstance(HelloCaller1.class) ;  
    21.         //调用sayHello方法  
    22.         helloCaller.sayHello() ;  
    23.           
    24.     }  
    25.       
    26. }  

    结果:

    HelloImpl Say Hello

    三,setter方式注入

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

    [java] view plain copy
     
    1. <span style="font-size:14px;">package guice.di;  
    2.   
    3.   
    4. import com.google.inject.Inject;  
    5.   
    6.   
    7. public class HelloCaller2 {  
    8. <span style="white-space:pre">  </span>  
    9. <span style="white-space:pre">  </span>private Hello hello ;  
    10.   
    11.   
    12. <span style="white-space:pre">  </span>public Hello getHello() {  
    13. <span style="white-space:pre">      </span>return hello;  
    14. <span style="white-space:pre">  </span>}  
    15. <span style="white-space:pre">  </span>//通过setter方法来注入hello属性  
    16. <span style="white-space:pre">  </span>@Inject  
    17. <span style="white-space:pre">  </span>public void setHello(Hello hello) {  
    18. <span style="white-space:pre">      </span>this.hello = hello;  
    19. <span style="white-space:pre">  </span>}  
    20. <span style="white-space:pre">  </span>  
    21. }</span>  

    (2)创建测试程序

    [java] view plain copy
     
    1. <span style="font-size:14px;">package guice.di;  
    2.   
    3. import com.google.inject.Binder;  
    4. import com.google.inject.Guice;  
    5. import com.google.inject.Injector;  
    6. import com.google.inject.Module;  
    7.   
    8. public class Client {  
    9.       
    10.     //创建一个测试程序  
    11.     public static void main(String[] args) {  
    12.           
    13.         Injector in = Guice.createInjector(new Module(){  
    14.             @Override  
    15.             public void configure(Binder arg0) {  
    16.                 //什么也不写  
    17.             }  
    18.         }) ;  
    19.         //得到HelloCaller的实例  
    20.         HelloCaller1 helloCaller = in.getInstance(HelloCaller1.class) ;  
    21.         //调用sayHello方法  
    22.         helloCaller.sayHello() ;  
    23.           
    24.     }  
    25.       
    26. }</span>  

    结果:

    HelloImpl Say Hello

    上面介绍了Guice框架的三种注入方式:属性注入,构造方法注入,setter方法注入

  • 相关阅读:
    学会分辨
    学会自重
    GIT使用笔记-fatal:multiple stage entries for merged file处理办法
    GIT-查看本地html帮助文档
    VS2013 GIT 克隆远程仓库
    GIT远程仓库地址变更
    VS2013中使用git发布解决方案master分支的时候出现错误
    C# WebService输出JSON 实现二
    WINDOWS下PhoneGap(Cordova)安装笔记
    SQLSERVER2012 Audit (审核)功能
  • 原文地址:https://www.cnblogs.com/ydxblog/p/7794287.html
Copyright © 2011-2022 走看看