使用Interface 定義對象的類型,框架根據(jù)對象的接口來提供服務(wù),這種模式是古而有之的java框架設(shè)計(jì)者必習(xí)之法,從最重量的EJB到最輕量的SPRing,都離不開這種方式,也的確解決了很多問題。比如在大家熟悉的Spring里:
等等,最后一個(gè)InitializingBean接口很邪惡阿?。∮惨狿OJO實(shí)現(xiàn)一個(gè)名字怪怪的afterPropertiesSet()函數(shù),侵入得不能再侵入阿。
所以,Spring提供了另一種方式,在配置文件里定義初始方法的名字: <bean class="foo" init-method="init"/>
其實(shí)Spring提倡的無侵入有兩種層次:
一種是像Quartz,JMX,WebService這些模塊,POJO啥都不用做,Spring使用AOP,FactoryBean這樣的機(jī)制使它們白日飛升具備了WebService,定時(shí)執(zhí)行的能力。
一種是像init-method的例子,POJO并不很明顯的實(shí)現(xiàn)Spring的接口,知覺Spring的存在,自己實(shí)現(xiàn)自己的函數(shù),然后由Spring的配置文件去調(diào)用它們。
前一種無侵入的作用非常明顯,后一種的意義就看具體的場景了,有時(shí)候?qū)崿F(xiàn)一下Spring的接口也沒什么所謂,但有時(shí)候各種原因會(huì)希望不顯式的實(shí)現(xiàn)接口。
在JDK5新增了Annotation的模式。Annotation 模式是xml模式的競爭者,但題目太大本篇就不討論了,我的觀點(diǎn)是主要看數(shù)據(jù)屬于配置數(shù)據(jù)還是代碼元數(shù)據(jù)。
本文forcus Interface vs Annotation來定義對象類型和行為。
最開始用Annotation 使Java代碼不再那么受傳統(tǒng)模式局限的是TestNG,然后JUnit 4緊跟其后,在默認(rèn)機(jī)制之外,可以用annotation 來靈活定義setup函數(shù)和測試函數(shù)。
下面,我們以SpringSide里的UndeleteEntity接口和@Undelete 標(biāo)識的實(shí)現(xiàn),具體演示一下兩者。
需求是假如把Entity對象定義為不能刪除,則基類的remove函數(shù)就不會(huì)真正刪除該對象,而是設(shè)置狀態(tài)列為"無效"。
Interface 定義:
Interface 在Entity使用:
新聞熱點(diǎn)
疑難解答
圖片精選