Google Guice 注入(@Inject註解)

上一節介紹通過註解來實現綁定關係,這一節介紹如何通過@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註解,將接口和實現類綁定在一起


(2)創建一個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屬性的實例注入進來


(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方法注入


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章