作者:江南白衣 

1.因?yàn)閮烧叩挠猛静煌?,所以Annotation與XML應(yīng)該并存

 Anootation vs XML 到了現(xiàn)在,在Spring和EJB3各占一邊的持續(xù)演示下,各自的用途已清晰。
   雖然兩者之間完全可以相互替代,沒有絕對(duì)不能做的事情,但卻存在好不好的問題,兩者的用途不同,應(yīng)該并用:

   "size=10,db_user=ito"這樣的參數(shù),仍然適合放在XML,YAML(ruby),properties,ini文件里。
    而Annotation中所放,是真正程序的一部分,是舊編程體系中所缺的那一塊東西。
 看看編程語言的發(fā)展:
    一開始只是函數(shù)的封裝;
    到了OO語言,對(duì)象有了自己的屬性和方法;
    到了框架滿天飛的年代,這些屬性和方法又有了自己的屬性,來告訴框架如何為自己提供服務(wù)。比如Spring和EJB3,POJO就用配置信息來告訴框架無侵入的提供服務(wù)。整個(gè)進(jìn)化的過程非常自然。

    因?yàn)檫@些信息本來就是程序的一部分,所以應(yīng)該仍然放在Code里頭,Spring把它割裂到XML明顯影響了代碼的閱讀。

2.Anotation/XML PK Interface,Spring 無侵入性的基礎(chǔ)
   切爾斯基的Blog講了Annotation/XML 對(duì)Interface的PK。這次PK,也可以認(rèn)為是Spring 對(duì) EJB2.1在框架無侵入性上的一次PK。
   在EJB2.1時(shí)代,POJO必須通過接口來向框架聲明一些東西,這就造成了框架的侵入性,強(qiáng)迫POJO實(shí)現(xiàn)一堆接口。而Spring,把這些元信息搬到了XML配置文件。
 在Spring里隨便就可以舉個(gè)例子。比如一個(gè)POJO,在Spring為它進(jìn)行依賴注入A和B后,需要根據(jù)A和B來裝配一個(gè)內(nèi)部屬性C,這樣就需要再跑一個(gè)init()函數(shù)。Spring提供兩種方式,一種侵入性的,實(shí)現(xiàn)InitializingBean接口的afterPropertiesSet()函數(shù)供Spring調(diào)用。   而另一種是無侵入性的,在Bean的xml節(jié)點(diǎn)里面自行定義init函數(shù)的名字。

3.Annotation目前的弱點(diǎn)
 一是Hibernate、Struts、三姑媽、四姨婆的annotation如果一股腦兒的全堆在可憐的POJO上很沒人道,如果三姑六婆都搶Transation這個(gè)Anontation就更慘了。
    二是annoation的表達(dá)能力有限,不如XML的強(qiáng)。

4.JSR250 - Common Annotations for the Java
    Final Draft已經(jīng)發(fā)布,八卦回來一看,也只是多定義了幾個(gè)Common Annotation而已。
   1.Generated  自動(dòng)生成的代碼要用此聲明,而且必須說明工具的名稱,如@Generated(“com.sun.xml.rpc.AProcessor”)

   2.Resource/Resources 就是EJB3里面用的資源引用。

   3.PostConstruct / PreDestroy 聲明那些如題的函數(shù)。
  
   還有一些安全方面的annotation,不關(guān)心。


文章:
Java下的框架編寫(1)--序
Java下的框架編程(2)-對(duì)泛型的無聊用法和為擦拭法站臺(tái) 
Java下的框架編程(3)--關(guān)于反射的碎話 
Java下的框架編程(4)--Annotation vs XML vs Interface 最新一Round 
Java下的框架編程(5)--cglib應(yīng)用
Java下的框架編程(6)--asm(待寫)