反向控制、依賴注入在很多地方都經常被提到。但是反向控制具體是什麼,比較難理解。
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的實現原理
2.1 構造函數注入
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 屬性注入
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();
}
}
可能這樣做看不出反轉控制的好處。但是,如果利用框架實現這個,而且你可以只是在配置文件裏面搭配一下調用者和實現者。那就會覺得這種解耦很棒。