閱讀374 返回首頁    go 阿裏雲 go 技術社區[雲棲]


PicoContainer(Ioc容器)在測試用例中的應用(二)

本篇主要介紹PicoContainer的一些主要特性,很簡單、很容易,但是很有效。喜歡英文的盆友也可以移步官方介紹,但是有些代碼在新版本並不好使,還需要自己研究=.=!。

依賴注入

PicoContainer支持很多種注入方式,比如構造器注入、setter注入、annotation注入等等很多了。我們常用的annotation注入和構造器注入就可以了。

1、annotation注入方式

public class TestRandomWriteAndRead extends TestWriteAndRead {
  @Inject
  protected Writer writer;
  @Inject
  protected Reader reader;
  
  //...
}

  //...
  public void startTest(){
    PicoContainer pico = new DefaultPicoContainer();   
    pico.addComponent(RandomReader.class);
    pico.addComponent(RandomWriter.class);
    pico.addComponent(TestRandomWriteAndRead.class);
    
    TestWriteAndRead readAndWrite = pico.getComponent(TestWriteAndRead.class);
  }
2、構造器注入
 
public class TestRandomWriteAndRead extends TestWriteAndRead {
  protected Writer writer;
  protected Reader reader;
  
  public TestRandomWriteAndRead (Reader reader, Writer writer){
    this.writer = writer;
    this.reader = reader;
  }
  
  //...
}

//startTest方法同上
需要注意的是以上兩種方式都是按照類型匹配注入的,如果pico容器中含有相同的兩個類型對象就會報錯。當然也可以按照名稱來匹配注入。看下麵的例子,pico會按照我們定義的名字,自動把reader和writer匹配到TestRandomWriteAndRead的構造函數中。
 
public class TestRandomWriteAndRead extends TestWriteAndRead {
  protected Writer writer;
  protected Reader reader;
  
  public TestRandomWriteAndRead (Reader reader, Writer writer){
    this.writer = writer;
    this.reader = reader;
  }
  
  //...
}

//...
public void startTest(){
  PicoContainer pico = new DefaultPicoContainer();   
  pico.addComponent("reader", RandomReader.class);
  pico.addComponent("writer", RandomWriter.class);
  pico.addComponent(TestWriteAndRead.class, TestRandomWriteAndRead.class,
      new ComponentParameter("reader"), new ComponentParameter("writer"));
  
  TestWriteAndRead readAndWrite = pico.getComponent(TestWriteAndRead.class);
}
單例模式
單例模式是我們常用的設計模式,在PicoContainer中用起來也非常簡單,僅需要加入容器時標記一下即可,此時容器僅會初始化一個實例,並注入到需要他的地方。下麵代碼中RandomReader就使用了單例模式。
 
public void startTest(){
  PicoContainer pico = new DefaultPicoContainer();   
  pico.as(CACHE).addComponent(RandomReader.class);
  pico.addComponent(RandomWriter.class);
  pico.addComponent(TestWriteAndRead.class);
  
  TestWriteAndRead readAndWrite = pico.getComponent(TestWriteAndRead.class);
}
生命周期
PicoContainer有自己的生命周期管理,僅需要實現Startable接口即可,此接口提供了start和stop方法。當調用pico.start();時,容器就會調用start方法開始運行這些實現的start方法,stop同理。這個很有意思,前麵講我們可以像搭積木一樣,在用例中加入各個操作模塊,然後使用start()命令觸發各個模塊的運作,讓整個係統run起來。
 
public class TestRandomWriteAndRead extends TestWriteAndRead implements Startable {
  //...
  
  @Override
  public void start() {
    //...
  }

  @Override
  public void stop() {
  }
}
其他功能
比如Scoped功能可以在一個容器下麵建立子容器,各不同類型的Container(我們前麵用的都是DefaultPicoContainer),各種高級功能。如果有興趣可以共同研究探討,我覺得既然使用輕量級的Ioc容器以上這些基本功能大體已經夠了。Enjoy it!

來源:https://www.taobaotest.com/blogs/2161

最後更新:2017-04-02 16:48:16

  上一篇:go Gallery
  下一篇:go 使用工具總集(不斷更新中....)