花木
導航
BlogJava
首頁
新隨筆
聯系
聚合
管理
<
2025年6月
>
日
一
二
三
四
五
六
25
26
27
28
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4
5
統計
隨筆 - 1
文章 - 1
評論 - 0
引用 - 0
常用鏈接
我的隨筆
我的評論
我的參與
留言簿
(1)
給我留言
查看公開留言
查看私人留言
隨筆檔案
2005年11月 (1)
文章檔案
2005年11月 (1)
搜索
最新評論
介紹IoC[轉]
介紹IoC
介紹 IOC
作者:冰云
icecloud(AT)sina.com
BLOG:
時間:
2004.02.15
版權聲明:
本文由冰云完成,首發于
CSDN
,作者保留中文版權。
未經許可,不得使用于任何商業用途。
歡迎轉載,但請保持文章及版權聲明完整。
如需聯絡請發郵件:
icecloud(AT)sina.com
一、什么是
IOC
IoC
就是
InversionofControl
,控制反轉。在
Java
開發中,
IoC
意味著將你設計好的類交給系統去控制,而不是在你的類內部控制。這稱為控制反轉。
下面我們以幾個例子來說明什么是
IoC
假設我們要設計一個
Girl
和一個
Boy
類,其中
Girl
有
kiss
方法,即
Girl
想要
Kiss
一個
Boy
。那么,我們的問題是,
Girl
如何能夠認識這個
Boy
?
在我們中國,常見的MM與
GG
的認識方式有以下幾種
1 青梅竹馬;
2 親友介紹;
3 父母包辦
那么哪一種才是最好呢?
青梅竹馬
:
Girl
從小就知道自己的
Boy
。
public
class
Girl{
void
kiss(){
Boyboy=
new
Boy();
}
}
然而從開始就創建的
Boy
缺點就是無法在更換。并且要負責
Boy
的整個生命周期。如果我們的
Girl
想要換一個怎么辦?(筆者嚴重不支持
Girl
經常更換
Boy
)
親友介紹
:由中間人負責提供
Boy
來見面
public
class
Girl{
void
kiss(){
Boyboy=BoyFactory.createBoy();
}
}
親友介紹,固然是好。如果不滿意,盡管另外換一個好了。但是,親友
BoyFactory
經常是以
Singleton
的形式出現,不然就是,存在于
Globals
,無處不在,無處不能。實在是太繁瑣了一點,不夠靈活。我為什么一定要這個親友摻和進來呢?為什么一定要付給她介紹費呢?萬一最好的朋友愛上了我的男朋友呢?
父母包辦
:一切交給父母,自己不用費吹灰之力,只需要等著
Kiss
就好了。
public
class
Girl{
void
kiss(Boyboy){
//kissboy
boy.kiss();
}
}
Well
,這是對
Girl
最好的方法,只要想辦法賄賂了
Girl
的父母,并把
Boy
交給他。那么我們就可以輕松的和
Girl
來
Kiss
了。看來幾千年傳統的父母之命還真是有用哦。至少
Boy
和
Girl
不用自己瞎忙乎了。
這就是
IOC
,將對象的創建和獲取提取到外部。由外部容器提供需要的組件。
我們知道
好萊塢原則
:
“Donotcallus,wewillcallyou.”
意思就是,
You,girlie,donotcalltheboy.Wewillfeedyouaboy
。
我們還應該知道
依賴倒轉原則
即
DependenceInversionPrincinple
,
DIP
。
EricGamma
說,要面向抽象編程。面向接口編程是面向對象的核心。
組件應該分為兩部分,即
Service
,
所提供功能的聲明
Implementation
,Service
的實現
好處是:多實現可以任意切換,防止
“
everythingdependsoneverything
”
問題.即具體依賴于具體。
所以,我們的
Boy
應該是實現
Kissable
接口。這樣一旦
Girl
不想
kiss
可惡的
Boy
的話,還可以
kiss
可愛的
kitten
和慈祥的
grandmother
。
二、
IOC
的
type
IoC
的
Type
指的是
Girl
得到
Boy
的幾種不同方式。我們逐一來說明。
IOCtype0
:
不用
IOC
public
class
Girl
implements
Servicable{
private
Kissablekissable;
public
Girl(){
kissable=
new
Boy();
}
public
void
kissYourKissable(){
kissable.kiss();
}
}
Girl
自己建立自己的
Boy
,很難更換,很難共享給別人,只能單獨使用,并負責完全的生命周期。
IOCtype1
,
先看代碼:
public
class
Girl
implements
Servicable{
Kissablekissable;
public
void
service(ServiceManagermgr){
kissable=(Kissable)mgr.lookup(
“
kissable”
);
}
public
void
kissYourKissable(){
kissable.kiss();
}
}
這種情況出現于
AvalonFramework
。一個組件實現了
Servicable
接口,就必須實現
service
方法,并傳入一個
ServiceManager
。其中會含有需要的其它組件。只需要在
service
方法中初始化需要的
Boy
。
另外,
J2EE
中從
Context
取得對象也屬于
type1
。
它依賴于配置文件
<container>
<componentname=
“
kissable
“
class=
“
Boy">
<configuration>
…
</configuration>
</component>
<componentname=
“
girl"class=
“
Girl"/>
</container>
IOCtype2
:
public
class
Girl{
private
Kissablekissable;
public
void
setKissable(Kissablekissable){
this
.kissable=kissable;
}
public
void
kissYourKissable(){
kissable.kiss();
}
}
Type2
出現于
SpringFramework
,是通過
JavaBean
的
set
方法來將需要的
Boy
傳遞給
Girl
。它必須依賴于配置文件。
<beans>
<beanid=
“
boy"class=
“