绑定和依赖注入区别
绑定,使用时 需要通过 injector 显示获取
依赖注入,只需要显示获取主类,他的依赖是通过@Injector 和 绑定关系 隐式注入的
http://blog.csdn.net/jing_le/article/category/1403309
http://blog.csdn.net/java_le/article/details/24850355
- Injector in = Guice.createInjector(new MyModule()) ;
- 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接口(注意类头上的注解,描述了这个接口要绑定的实现类)
- @ImplementedBy(HelloImpl.class)
- public interface Hello {
- void sayHello() ;
- }
Hello.java这个接口的具体实现类:HelloImpl.java(类头上的注解,这类是单列还是动态创建)
- @Singleton
- public class HelloImpl implements Hello{
- @Override
- public void sayHello() {
- System.out.println("HelloImpl say hello");
- }
- }
我们的MyModule实现类(具体的绑定关系被注释了)
- package guice.binder;
- import com.google.inject.Binder;
- import com.google.inject.Module;
- public class MyModule implements Module{
- @Override
- public void configure(Binder binder) {
- //将借口hello.java 绑定到实现类HelloImpl.java上
- //Singleton:表示是scope是单列的,Guice中类的scope只有两类,单例,或者每次都是new的一个新的对象
- //<span style="white-space:pre"> </span>binder.bind(Hello.class).to(HelloImpl.class).in(Singleton.class) ;
- }
- }
- Injector in = Guice.createInjector(new MyModule()) ;
- 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属性)
- package guice.di;
- import com.google.inject.Inject;
- //HelloCaller将会去调用Hello这个接口提供的服务
- public class HelloCaller {
- //通过@Inject,来完成属性的注入
- @Inject
- private Hello hello ;
- //调用Hello的sayHello方法(实际上就是去调用HelloImpl的sayHello,因为我们将Hello的实现指定是HelloImpl)
- public void sayHello(){
- hello.sayHello() ;
- }
- }
通过@Inject注解将Hello属性的实例注入进来
- Injector in = Guice.createInjector(new Module(){
- @Override
- public void configure(Binder arg0) {
- //什么也不写
- }
- }) ;
- //得到HelloCaller的实例
- HelloCaller helloCaller = in.getInstance(HelloCaller.class) ;
- //调用sayHello方法
- helloCaller.sayHello() ;
构造方法注入
(1)Hello和HelloImpl类还是上面那样不用变,唯一变化的是HelloCaller类
- 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() ;
- }
- }
setter方式注入
(1)Hello和HelloImpl类还是上面那样不用变,唯一变化的是HelloCaller类
- //通过setter方法来注入hello属性
- @Inject
- public void setHello(Hello hello) {
- this.hello = hello;