來自:碼農翻身(微訊號:coderising)
最近這幾年,XML大臣的宅邸車水馬龍,像什麼Spring, Hibernate, MyBatis 等大大小小的官員進京來都要拜訪一下,無數的冰敬碳敬悄悄地送入府中, 真可謂紅極一時, 正處於人生巔峰。 原因很簡單,Java帝國的配置檔案幾乎都在使用XML, 自然都歸XML大臣管理,想不紅都難!
其他大臣看在眼裡,恨在心裡,他們決定聯合起來,堅決打擊XML大臣的囂張氣焰, 堅決把白花花的銀子轉移到自己府中來。 幾位老傢伙商量以後,決定還是推舉老成持國的IO大臣為首領,給XML大臣一點顏色瞧瞧。
可是IO大臣想了半天,也沒什麼好辦法。
這一天有個姓安的翰林自報家門求見, 說是可以助IO大臣一臂之力。
“安大人有何見教?” IO大臣懶洋洋地問道,他對這些讀死書的翰林們沒什麼好感。
“大人,下官在負責Java註解,對付XML大臣,也許是個突破口”
“註解? 這是什麼東西?” IO大臣確實是有點老了
“其實就是元資料了”
“元資料?” IO大臣一頭霧水。
“嗯, Metadata” 安翰林把英文都整齣來了。
“賣它推它?” IO大臣明顯英文不好。
旁邊的幕僚一個勁兒的使眼色, 諄諄告誡安翰林要通俗易懂。
安翰林說: “大人肯定知道@Override,@SuppressWarning等註解吧? ”
IO大臣點頭。
安翰林接著說: “所謂元資料, 就是描述資料的資料了,換句話說可以給其他資料提供描述性資訊, 例如Java類中的某個方法,可以認為是一種資料, 如果我的@Override 一旦被用到這個方法上,那就意味著要改寫父類/介面的方法了,於是我的@Override 就給這個方法提供了額外的資訊。”
“但是在原始碼中寫個@Override 似乎也沒什麼用處啊? ” IO大臣問道
“所以這隻是元資料, 它給其他資料(如Java方法)提供了資訊, 但是怎麼樣利用這些資訊那就不歸我管了。”
“那歸誰管?”
“比如@Override , 由編譯器來管,當編譯這個Java 檔案的時候,它就會檢查被@Override 修飾的方法是否和父類的方法和引數相同, 如果不同,就會報錯了。”
IO大臣說: “奧,明白了,所謂的註解有點像加強版的註釋, 這個“註釋”不但有一定的格式,還有特定的含義,這樣別的工具就可以讀取它來做事情了!”
安翰林鬆了一口氣, 心裡暗自佩服IO大臣的總結能力。
“我記得這個@Override註解很早就有了啊,好像是JDK1.4吧”
“沒錯, 之前JDK內建了@Override、@Deprecated 、@SuppressWarnings等註解, 但是用處不大, 下官有個想法,乾脆允許臣民們自定義註解得了” 安翰林開始切入正題。
“自定義? 就是讓臣民們自己寫? ”
“是的大人, 比如我可以自定義一個叫做 @Test的 註解:” 安翰林說著把寫好的程式碼呈了上去。
安翰林接著說: 大人請看我這裡定義了一個叫做Test的註解,它有個ignore方法, 一會兒您老就看到它的用途了, 這個註解是應用在方法上的 @Target(ElementType.METHOD), 在執行時起作用@Retention(RetentionPolicy.RUNTIME)。
IO大臣問道:“稍等, 我怎麼還看到了@Target,@Retention, 這是什麼? ”
“這稱為元註解,可以認為是註解的註解。” 安翰林嘿嘿一笑說 “@Target表示該註解的應用標的,可以是類、方法、 方法引數等等, @Retention表示這個註解要保留到什麼時候, 可以只在原始碼中, 或者class 檔案中, 或者是執行時。”
“ 註解的註解, 真是夠拗口的啊, 這個自定義的註解@Test 該怎麼使用呢? ”
安翰林又展示了另外一段程式碼:
IO大臣看了下,心想這自定義的註解和JDK內建的註解都差不多嘛,@Test修飾了方法, 表示這個方法可以作為測試用例來執行, @Test(ignore=true)則表示雖然這是個測試方法, 但是暫時忽略,不用執行, 果然簡潔而清爽,老夫真是小看了這個安翰林。
“@Test註解的定義和使用,只是定義了行為語意,怎麼樣實現這個行為呢? ” IO大臣問道
安翰林早有準備:“大人請看,我可以在執行時透過反射的方式取出把方法的註解,如果這個註解是@Test, 並且沒有被ignore , 那就可以透過反射去執行這個方法了, 是不是很簡單?”
IO大臣微微點了點頭,表示贊同,接著便閉目陷入了沉思: 這個東西有點意思,在一個方法上添加了簡單的修飾性註解@Test以後,這個方法突然間就有了額外的語意,變成了可以執行的測試用例了 !
如果是XML老頭兒, 該怎麼描述類似的行為呢? 也許得這樣:
相比於簡潔的@Test註解,這個方式實在是太複雜了, 更重要的是每次增加新的方法,除了修改Java檔案之外,還得記著修改這個XML檔案, 實在是繁瑣。
嗯, 看來這個註解確實是個殺手鐧, 要謹慎使用,一擊必中。
想到這裡,IO大臣睜開眼睛,喜笑顏開,讓安翰林寫一個關於註解的詳細奏章,自己在合適的時候呈給皇上。
初六陽光燦爛,IO大臣看到早朝的皇上心情不錯,就把奏章呈了上去。
“註解? 這是什麼東西?” 皇上根本沒心思瞭解細節。
“啟奏陛下,這個註解能夠部分的代替一些XML的配置工作” IO大臣一邊小心翼翼地回覆,一邊用餘光向XML大臣掃去。
看到IO大臣向自己發難, XML大臣立刻警覺起來, 他馬上說: “陛下,可否讓老臣一觀?”
皇帝示意讓呂公公把奏章遞給XML大臣。
XML大臣看了一會兒就明白大事不好, 這簡直是釜底抽薪, 如果這個帝國批准了這個玩意兒,允許臣民們自定義註解,自己的勢力要大大地被削弱了。
XML大臣腦海中出現一副可怕的場景, Spring, Struts, Hibernate 等紛紛倒戈,都採用註解來進行系統配置,白花花的銀子開始流向IO大臣的府邸……
不, 堅決要把這點星星之火迅速撲滅。
“陛下,依老臣之見, 此法斷不可行!” XML大臣斬釘截鐵。
“為何不可行? 使用註解,配置靠近程式碼,容易閱讀、容易修改!” IO大臣立刻反擊, 為了展示易讀易改,IO大臣還現場寫了一段程式碼,描述了一個普通的Java 類是如何向資料庫表和列對映的。 朝中多位大臣齊聲喝彩, 為IO大臣搖旗吶喊。
“單獨看一個當然很清晰, 但是如果多了, 配置分散在各個Java檔案中, 極難查詢,到時候你哭都來不及, 如果你用了XML, 所有的配置集中在一處, 一目瞭然。 還有,如果你想修改配置就得改Java源檔案,重新編譯部署,這也太扯了吧?!” XML大臣不甘示弱。
眼看著兩位重臣開始劍拔弩張, 皇帝決定出面和稀泥, 他也不希望一家獨大,也想平衡一下朝中關係。
“兩位愛卿,依朕之意,還是先在JDK中加入自定義註解的支援,至於是用註解還是用XML, 還是讓朕的子民們去選擇吧! ”
看到皇上主意已定, 兩位大臣只好退下。
自定義註解釋出了, 令大家沒有想到的是,無論是註解還是XML配置都沒有佔據壟斷地位,很多人把二者混合起來使用了! 對於一些需要集中配置的場合,例如資料源的配置, 自然是用XML。 另外一方面對於@Controller, @RequestMapping, @Transactional 這樣的註解 , 大家更喜歡和Java方法寫在一起,顯得簡單而直觀。
這正如朝中的局勢,沒人能夠一家獨大,XML大臣雖然丟失了一些領地,但依然是不可忽視的力量。 一場爭鬥,唯一的大贏家可能就是安翰林了,他被任命為Annotation大臣,專門管理自定義的註解。
(完)
●編號656,輸入編號直達本文
●輸入m獲取文章目錄
駭客技術與網路安全
更多推薦《18個技術類公眾微信》
涵蓋:程式人生、演演算法與資料結構、駭客技術與網路安全、大資料技術、前端開發、Java、Python、Web開發、安卓開發、iOS開發、C/C++、.NET、Linux、資料庫、運維等。