374
阿裏雲
技術社區[雲棲]
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!
最後更新:2017-04-02 16:48:16