国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

侵入,無侵入? Annotation vs Interface

2019-11-18 15:25:43
字體:
供稿:網(wǎng)友

   1. Interface

   使用Interface 定義對象的類型,框架根據(jù)對象的接口來提供服務(wù),這種模式是古而有之的java框架設(shè)計(jì)者必習(xí)之法,從最重量的EJB到最輕量的SPRing,都離不開這種方式,也的確解決了很多問題。比如在大家熟悉的Spring里:

  • BeanFactoryAware接口,框架看到它就會(huì)調(diào)用Bean的setBeanFactory(BeanFactory beanFactory) 函數(shù),將BeanFactory傳給它,讓它自行用BeanFactory獲得更多Bean,而不僅限于依靠注入的Bean。
  • FactoryBean接口,框架看到它就不會(huì)把這個(gè)Bean放入自己的Context,而是調(diào)用它的getObject()函數(shù),將返回的結(jié)果作為Bean放入。Spring里很多功能依靠于這個(gè)擴(kuò)展機(jī)制,因?yàn)樗梢杂肍actory模式返回任意類型對象,而不是<bean class="foo">中class指定類型。
  • InitializingBean接口,因?yàn)楹芏郆ean在各setter注入后,還需要一個(gè)總的init函數(shù)進(jìn)行初始化,比如需要同時(shí)根據(jù)注入的屬性A和 B,來初始化屬性C的值。這時(shí)候框架就會(huì)調(diào)用afterPropertiesSet() 初始化。

        等等,最后一個(gè)InitializingBean接口很邪惡阿?。∮惨狿OJO實(shí)現(xiàn)一個(gè)名字怪怪的afterPropertiesSet()函數(shù),侵入得不能再侵入阿。

   2. 無侵入

        所以,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)接口。

 3. Annotation   

      在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ù)。

   4. 對比演示

  下面,我們以SpringSide里的UndeleteEntity接口和@Undelete 標(biāo)識的實(shí)現(xiàn),具體演示一下兩者。

  需求是假如把Entity對象定義為不能刪除,則基類的remove函數(shù)就不會(huì)真正刪除該對象,而是設(shè)置狀態(tài)列為"無效"。

 

Interface是這樣實(shí)現(xiàn)的:

Interface 定義:

public interface UndeletableEntity {
    void setStatus(String status);
}

Interface 在Entity使用:

public class Book implements UndeletableEntity {
  private String status;  public void setStatus(String status) {
   this.status = status;
  }
 }



發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 绍兴县| 千阳县| 峨眉山市| 宜城市| 昭觉县| 东安县| 营口市| 烟台市| 龙门县| 册亨县| 高要市| 浮山县| 建水县| 诸暨市| 南丹县| 阿尔山市| 大埔区| 兴和县| 资兴市| 颍上县| 永登县| 广东省| 肥西县| 西丰县| 鞍山市| 长阳| 双柏县| 海盐县| 兰州市| 莫力| 河津市| 柯坪县| 育儿| 和平县| 松溪县| 离岛区| 彭阳县| 桦南县| 鄢陵县| 内江市| 滦南县|