控制反轉(IOC)的一個spring框架很重要的特點,那到底什麼是控制反轉,控制反轉有什麼用呢?
什麼是控制反轉呢?
(百度百科)控制反轉(Inversion of Control,縮寫爲IoC),是面向對象編程中的一種設計原則,可以用來減低計算機代碼之間的耦合度。其中最常見的方式叫做依賴注入(Dependency Injection,簡稱DI),還有一種方式叫“依賴查找”(Dependency Lookup)。通過控制反轉,對象在被創建的時候,由一個調控系統內所有對象的外界實體將其所依賴的對象的引用傳遞給它。也可以說,依賴被注入到對象中。
控制反轉,顧名思義應該就是控制關係的反轉。例如一司機H,一女明星L,一演藝公司K。原本的控制關係是L依賴H,就是L控制司機,控制反轉後就是,演藝公司安排司機給女明星,那麼相當於司機選擇女明星,這樣控制關係就反轉了。
那麼控制反轉有什麼優勢呢?
假如演藝公司K有100個演員,都要求司機H作爲他們的司機(假如H是勞模),但是有一天司機H生病了,要換一個司機。
這時有好問的同學就開始發問了,說“換司機有什麼問題嗎?”好的,請看下面的代碼:
class DriverH {
public void dosomething() {
.....
}
}
class DriverW {
public void dosomething() {
.....
}
}
.....
class ActorL{
private String name;
public void doSomething(){
new DriverH().dosomething();
}
}
class ActorP{
private String name;
public void doSomething(){
new DriverH().dosomething();
}
}
.....
如果演員們要司機W,需要修改在每個演員類裏面修改,那至少要修改代碼100處不是嗎?這樣顯得太麻煩了。
如果利用了控制反轉呢?且看代碼:
class DriverH {
public void dosomething() {
.....
}
}
class DriverW {
public void dosomething() {
.....
}
}
.....
class ActorL{
private String name;
....
public void doSomething(){
context.getBean("Driver").dosomething();
}
}
class ActorP{
private String name;
...
public void doSomething(){
context.getBean("Driver").dosomething();
}
}
.....
這時換司機類就只需要在xml配置文件中修改<bean name="Driver" ref="..."></bean>
一處就好。
後語
眼看就到文章的結尾了,這時必定有一個言辭激烈、善於唱、跳、rap、籃球的鍵盤俠開始向我發難了,立即post上他的代碼,來質疑spring的必要性,認爲用java源碼就可以輕鬆實現上面的功能:
class Driver{
}
class DriverH extends Driver{
public void dosomething() {
.....
}
}
class DriverW extends Driver{
public void dosomething() {
.....
}
}
.....
class Drivers{
public static Driver getDriver(){
return new DriverX();//此處X表示某一個司機
}
}
class ActorL{
private String name;
....
public void doSomething(){
Drivers.getDriver().dosomething();
}
}
class ActorP{
private String name;
...
public void doSomething(){
Drivers.getDriver().dosomething();
}
}
.....
引用雷軍的一句雷言雷句:
你他媽是來砸場子的事吧
槓精
槓精
槓精
當然能夠用java來實現上面的功能,因爲spring本身就是用java來實現的,而且spring的特點又不止ioc這一個,spring的源碼也非常優秀,效率很高。