最详细解析:Google Guice 小试牛刀(@Inject注解)
下面的是一些入口
上一节介绍通过注解来实现绑定关系,这一节介绍如何通过@Inject来完成依赖注入的功能:
(1)属性注入
(2)构造方法注入
(3)setter方法注入
一.属性注入
(1)创建一个接口Hello.java和一个实现类HelloImpl
[java] view plain copy 
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 ![在CODE上查看代码片]()
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 ![在CODE上查看代码片]()
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 ![在CODE上查看代码片]()
HelloImpl Say Hello 二.%20构造方法注入(1)Hello和HelloImpl类还是上面那样不用变,唯一变化的是HelloCaller类
[java] view%20plain copy ![在CODE上查看代码片]()
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 ![在CODE上查看代码片]()
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 ![在CODE上查看代码片]()
<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 ![在CODE上查看代码片]()
<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) { //什么也不写 } }) ;