1. 程式人生 > >Plexus——Spring之外的IoC容器

Plexus——Spring之外的IoC容器

Plexus是什麼?它是一個IoC容器,由codehaus在管理的一個開源專案。和Spring框架不同,它並不是一個完整的,擁有各種元件的大型框架,僅僅是一個純粹的IoC容器。本文講解Plexus的初步使用方法。

Plexus和Maven的開發者是同一群人,可以想見Plexus和Maven的緊密關係了。由於在Maven剛剛誕生的時候,Spring還不 成熟,所以Maven的開發者決定使用自己維護的IoC容器Plexus。而由於Plexus的文件比較爛,根據社群的呼聲,下一版本的Maven 3則很可能使用比較成熟的Guice框架來取代Plexus,但更換底層框架畢竟不是一件輕鬆的事情,所以現階段學習瞭解Plexus還是很有必要的。並 且Plexus目前並未停止開發,因為它的未來還未可知。除了Maven以外,WebWork(已經與Struts合併)在底層也採用了Pleuxs。

為了學習使用Plexus,首先我們還是用Maven建立一個乾淨的java專案:

1 mvn archetype:create /
2 -DarchetypeGroupId=org.apache.maven.archetypes /
3 -DgroupId=demo /
4 -DartifactId=plexus-demos

生成專案後,在pom.xml加入所需的依賴包:

1 <dependencies>
2 <dependency>
3 <groupId>org.codehaus.plexus</
groupId>
4 <artifactId>plexus-container-default</artifactId>
5 <version>1.0-alpha-10</version>
6 </dependency>
7 </dependencies>

Plexus與Spring的IoC容器在設計模式上幾乎是一致的,只是語法和描述方式稍有不同。在Plexus中,有ROLE的概念,相當於Spring中的一個Bean。我們首先來通過介面定義一個role:

01 packagedemo.plexus-demos;
02
03 publicinterfaceCheese
04 {
05 /** The Plexus role identifier. */
06 String ROLE = Cheese.class.getName();
07
08 /**
09 * Slices the cheese for apportioning onto crackers.
10 * @param slices the number of slices
11 */
12 voidslice(intslices );
13
14 /**
15 * Get the description of the aroma of the cheese.
16 * @return the aroma
17 */
18 String getAroma();
19 }

然後做一個實現類:

01 packagedemo.plexus-demos;
02
03 publicclassParmesanCheese
04 implementsCheese
05 {
06 publicvoidslice(intslices )
07 {
08 thrownewUnsupportedOperationException("No can do");
09 }
10
11 publicString getAroma()
12 {
13 return"strong";
14 }
15 }

接下來是在xml檔案中定義依賴注入關係。這一點和Spring的ApplicationContext是幾乎一樣的,只不過Plexus的xml描述方式稍有不同。另外,Plexus預設會讀取專案的classpath的META-INF/plexus/components.xml,因此我們在專案中建立src/main/resources/META-INF/maven目錄,並將配置檔案components.xml放置於此。配置檔案的內容如下:

1 <component-set>
2 <components>
3 <component>
4 <role>demo.plexus-demos.Cheese</role>
5 <role-hint>parmesan</role-hint>      
6 <implementation>demo.plexus-demos.ParmesanCheese</implementation>
7 </component>
8 </components>
9 </component-set>

大功告成,接下來只需要做一個使用Cheese元件的類來試用一下:

01 importorg.codehaus.plexus.PlexusContainer;
02 importorg.codehaus.plexus.PlexusContainerException;
03
04 publicclassApp
05 {
06 publicstaticvoidmain(String args[])throwsException
07 {
08 PlexusContainer container=newDefaultPlexusContainer();
09 container.dispose();
10
11 Cheese cheese = (Cheese) container.lookup( Cheese.ROLE,"parmesan");
12 System.out.println("Parmesan is "+ cheese.getAroma() );
13 }
14 }