Spring之IoC 控制反轉和依賴注入

反向控制、依賴注入在很多地方都經常被提到。但是反向控制具體是什麼,比較難理解。

Ioc(Inverse  of  Control)  是Spring容器的內核。

1. IoC概念

Ioc,主要是實現了面向接口編程,並且徹底分離了調用者和實現類的強耦合關係。

看下面的代碼:

public interface Manager {
	public void  f();
}
public class PersonManager implements Manager{
	@Override
	public void f() {
		System.out.println("PersonManger");
	}
}
public class PersonAction {
	Manager manager = new PersonManager();
	public void g(){
		manager.f();
	}
	
	public static void main(String [] args){
		PersonAction pa = new PersonAction();
		pa.g();
	}
}

可以看到PersonAction類對PersonManager類的依賴是非常強的。 如果PersonManager實現類變了,那麼PersonAction類必須要改代碼。

控制反轉:

控制:是指 決定 PersonAction中 manager 實現者的控制權。

反轉:是指 這個權利不再由PersonAction控制了, 而由別人控制了。 這樣,在實現類PersonManager改變後,我這個PersonAction是可以不變的。

IoC這個名字比較難以理解,所以又提出了  依賴注入(DI,Dependency  Injection) 代替IoC。


2. IoC的實現原理

其實依賴注入反轉控制,實現也蠻簡單的。從注入方法上看,主要可以劃分爲三種類型:構造函數注入、屬性注入和接口注入。Spring支持構造函數注入和屬性注入。

2.1  構造函數注入

只要把上面例子中得PersonAction改一下就可以了。
public class PersonAction {
	Manager manager ;
	public PersonAction(Manager manager){
		this.manager = manager;
	}
	public void g(){
		manager.f();
	}
	
	public static void main(String [] args){
		PersonAction pa = new PersonAction(new PersonManager());
		pa.g();
	}
}

這樣的話,我們就可以在使用的時候,再確定PersonManager中manager的具體類型了。如果把main方法移到別的類中。那麼這個PersonAction與PersonManager就解耦了。

2.2 屬性注入

還是改一下PersonAction類,加入一個set方法即可。
public class PersonAction {
	private Manager manager ;
	
	public void g(){
		manager.f();
	}
	public void setManager(Manager manager){
		this.manager = manager;
	}
	
	public static void main(String [] args){
		PersonAction pa = new PersonAction();
		pa.setManager(new PersonManager());
		pa.g();
	}
}

可能這樣做看不出反轉控制的好處。但是,如果利用框架實現這個,而且你可以只是在配置文件裏面搭配一下調用者和實現者。那就會覺得這種解耦很棒。









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