首页 > 学院 > 开发设计 > 正文

Google Guice 注入(@Inject注解)

2019-11-08 00:50:24
字体:
来源:转载
供稿:网友

最详细解析:Google Guice 小试牛刀(@Inject注解)

下面的是一些入口

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

(1)属性注入

(2)构造方法注入

(3)setter方法注入

一.属性注入

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

[java] view plain copy 在CODE上查看代码片package guice.di;    import com.google.inject.ImplementedBy;  //将这个接口和实现类HelloImpl绑定到一起  @ImplementedBy(HelloImpl.class)  public interface Hello {      void sayHello() ;  }      package guice.di;    //这里没有加@Singleton,表示是动态创建这个类,不是单例的  public class HelloImpl implements Hello{            @Override      public void sayHello() {          System.out.PRintln("HelloImpl Say Hello");      }  }  

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

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

[java] view%20plain copy package guice.di;    import com.google.inject.Inject;    //HelloCaller将会去调用Hello这个接口提供的服务  public class HelloCaller {            //通过@Inject,来完成属性的注入      @Inject      private Hello hello ;%20 %20 //这个就相当于:private%20Hello%20hello%20=%20new%20HelloImpl();%20把Hello实例化了    //调用Hello的sayHello方法(实际上就是去调用HelloImpl的sayHello,因为我们将Hello的实现指定是HelloImpl)      public void sayHello(){          hello.sayHello() ;      }  }  通过@Inject注解将Hello属性的实例注入进来

(3)创建一个测试类Client

[java] view%20plain copy package guice.di;    import com.google.inject.Binder;  import com.google.inject.Guice;  import com.google.inject.Injector;  import com.google.inject.Module;    public class Client {            //创建一个测试程序      public static void main(String[] args) {                    Injector in = Guice.createInjector(new Module(){              @Override              public void configure(Binder arg0) {                  //什么也不写              }          }) ;          //得到HelloCaller的实例          HelloCaller helloCaller = in.getInstance(HelloCaller.class) ;          //调用sayHello方法          helloCaller.sayHello() ;      }        }  结果:

[java] view%20plain copy HelloImpl Say Hello  

二.%20构造方法注入(1)Hello和HelloImpl类还是上面那样不用变,唯一变化的是HelloCaller类

[java] view%20plain copy package guice.di;    import com.google.inject.Inject;    public class HelloCaller1 {      //包含一个Hello属性      private Hello hello ;      //@Inject注解写在构造方法上,通过构造方法的方式注入属性hello      @Inject      public HelloCaller1(Hello hello){          this.hello = hello ;      }            public void sayHello(){          hello.sayHello() ;      }  }  (2)创建测试程序

[java] view%20plain copy package guice.di;    import com.google.inject.Binder;  import com.google.inject.Guice;  import com.google.inject.Injector;  import com.google.inject.Module;    public class Client {            //创建一个测试程序      public static void main(String[] args) {                    Injector in = Guice.createInjector(new Module(){              @Override              public void configure(Binder arg0) {                  //什么也不写              }          }) ;          //得到HelloCaller的实例          HelloCaller1 helloCaller = in.getInstance(HelloCaller1.class) ;          //调用sayHello方法          helloCaller.sayHello() ;                }        }  结果:

HelloImpl%20Say%20Hello三,setter方式注入

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

[java] view%20plain copy <span style="font-size:14px;">package guice.di;      import com.google.inject.Inject;      public class HelloCaller2 {  <span style="white-space:pre">  </span>  <span style="white-space:pre">  </span>private Hello hello ;      <span style="white-space:pre">  </span>public Hello getHello() {  <span style="white-space:pre">      </span>return hello;  <span style="white-space:pre">  </span>}  <span style="white-space:pre">  </span>//通过setter方法来注入hello属性  <span style="white-space:pre">  </span>@Inject  <span style="white-space:pre">  </span>public void setHello(Hello hello) {  <span style="white-space:pre">      </span>this.hello = hello;  <span style="white-space:pre">  </span>}  <span style="white-space:pre">  </span>  }</span>  

(2)创建测试程序

[java] view%20plain copy 派生到我的代码片<span style="font-size:14px;">package guice.di;    import com.google.inject.Binder;  import com.google.inject.Guice;  import com.google.inject.Injector;  import com.google.inject.Module;    public class Client {            //创建一个测试程序      public static void main(String[] args) {                    Injector in = Guice.createInjector(new Module(){              @Override              public void configure(Binder arg0) {                  //什么也不写              }          }) ;          //得到HelloCaller的实例          HelloCaller1 helloCaller = in.getInstance(HelloCaller1.class) ;          //调用sayHello方法          helloCaller.sayHello() ;                }        }</span>  结果:

HelloImpl Say Hello

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

最最重要的是,在自己的netty后台服务项目中,启动netty服务的时候startup方法可以将Injector对象传入到WebContainer类中,然后在Registerxx中,注册User类为web接口时,将Injector对象放入对应的User类中,在Registerxx注册服务时实例化User类的时候,就将User中的Injector属性赋值。然后在User类中就可以使用Injector中的对象。

其实和Spring差不多,只是一个是用xml的,一个使用注解的。

特别关注:

  Injector in = Guice.createInjector(new Module(){              @Override              public void configure(Binder arg0) {                  //什么也不写              }          }) ;  


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表