上一节介绍通过注解来实现绑定关系,这一节介绍如何通过@Inject来完成依赖注入的功能:
(1)属性注入
(2)构造方法注入
(3)setter方法注入
一.属性注入
(1)创建一个接口Hello.java和一个实现类HelloImpl
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注解,将接口和实现类绑定在一起
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属性的实例注入进来
(3)创建一个测试类Client
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() ;
}
}
结果:
HelloImpl Say Hello
(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() ;
}
}
(2)创建测试程序
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 Say Hello
三,setter方式注入
(1)Hello和HelloImpl类还是上面那样不用变,唯一变化的是HelloCaller类
package guice.di;
import com.google.inject.Inject;
public class HelloCaller2 {
private Hello hello ;
public Hello getHello() {
return hello;
}
//通过setter方法来注入hello属性
@Inject
public void setHello(Hello hello) {
this.hello = hello;
}
}
(2)创建测试程序
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 Say Hello
上面介绍了Guice框架的三种注入方式:属性注入,构造方法注入,setter方法注入