上一節介紹通過註解來實現綁定關係,這一節介紹如何通過@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方法注入