非侵入式系介紹DI用語,我得理解是兩個組件(類,接口)之間,比較獨立,不深入到另一個類內部,哪位大蝦能點撥一二?
關于“侵入式”和“非侵入式”設計
有讀者講“侵入式”這一術語無法理解,這里給一個簡單解釋,是我個人的看法。
例如,我們可能需要對類A的對象做引用計數,這里有兩種基本可能性:將計數功能納入類A的設計內(侵入式引用計數設計,此時類A的對象中包含了與引用計數有關的要素,這顯然是與類A所要表示的概念無關的東西),或者將計數功能放在類A之外(非侵入式引用計數)。
我基本上知道了,從夏大蝦得著作中得知。
比如struts,需要繼承一些struts得類,這就是侵入式,使得系統離不開那個框架。
而spring中,業務類不需要繼承框架得類,將來拋棄spring也比較方便。
樓上大蝦(土豆塊)能否談下ejb與spring之間得關系。你用ejb嗎?如果用了,感覺如何?
非侵入式(non-intrusive)設計是目前非常熱門的話題。在一般的討論中,非侵入式設計總是和Spring這樣的IoC容器或者AOP技術聯系在一起。但是從思想上說,non-intrusive并不等價于IoC或者AOP,它是一個比AOP更加寬泛的概念。
首先,我們考察一下何謂intrusive。典型的intrusive實現是繼承特定的基類, 或者實現特定的接口. 在抽象的意義上說, intrusive意味著在基礎結構中預留了一些特殊的,專用的結構, 這些結構對于基礎功能而言不僅僅是無用的, 甚至是有害的, 例如影響性能或者模糊了原有的概念結構, 而系統整體的后期擴展能力也受到這些預設的結構通道的限制.
non-intrusive設計的基本特點是盡量利用基礎結構的元素, 而不是引入額外的特殊結構.例如, 在witrix平臺的tpl模板中
<button tpl:tag="ui:FlatButton" value="xx" onclick="alert('ok')" />
如果后臺tpl引擎不解析<ui:FlatButton>標簽, 那么該標簽的表現就是普通的html button. 這里整個頁面的界面表現結構沒有被tpl標簽所破壞,而如果像jsp tag那樣強行規定必須采用節點語法, 即
<ui:FlatButton value="xx" onclick="alert('ok')" />
則在沒有tpl引擎的情況下, 界面結構被tpl標簽所破壞,此時在dreamweaver這樣的可視化工具中我們無法再識別出有效的界面元素, 喪失了WYSIWYG編輯的能力.
tpl:tag屬性屬于html語法本身規定了的自定義屬性, 它在html中的存在是符合規范的, 而且它對于button來說沒有造成什么限制或損害, 因而是一種無害的標記. 在沒有tpl模板引擎的情況下, tpl:tag屬性與其他自定義屬性一樣處于同樣的地位, 沒有什么特殊的作用. 而一旦tpl模板引擎識別出該特殊標記, 整個節點就被解釋成一個具有豐富表現形式的平面按鈕而不是系統缺省風格的普通按鈕. 從級列設計的角度上說, button對應于ui:FlatButton在沒有tpl解析能力情況時退化了的結果. 在EJB3的規范中, 普通的POJO(Plain Old Java Object)對象在經過無害的標記(annotation)之后通過Enhance過程獲得持久化等特性, POJO正對應于EJB Object的退化形式. 在某種意義上我們可以說, 存在著多少種可退化方式,就對應著多少種non-intrusive design。
與傳統設計中的結構堆砌不同, 現代技術更加強調在原有結構基礎上的同態變化, 關注原有結構中的某些部分出現特殊意義后所產生的對稱破缺. 在non-intrusive設計中, 基礎的結構中沒有為擴展內置什么特殊的結構, 一般僅僅是標記而已, 這些標記是無害的甚至本身在基礎結構中是有用的, 例如某些javascript庫在前臺html頁面中利用html標簽的class屬性作為標記. 為了識別這些屬于結構標準部分的標記并對之進行處理,我們需要一種可選擇的結構透明性, 具體來說我們需要能滲透到系統內部,準確的定位到標記處. 這就類似于x光檢測, x光只與某些特殊材料發生強烈作用而普通部分對于x光而言是透明的. 而當外部引擎識別出這些特殊的標記之后, 可能需要操縱該局部結構, 例如在基礎結構中插入一些新的結構以實現基礎結構的增強. 這些都可能需要應用類似于AOP的技術, 而在這一增強過程中關于擴展結構的具體知識存在于擴展引擎中而不是基礎結構中, 因而往往整體表現出一種IoC的特性.
轉自:http://hi.baidu.com/westsky/blog/item/46d452f0127cebaaa50f522f.html