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 package demo.plexus-demos;
02   
03 public interface Cheese
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     void slice( int slices );
13   
14     /**
15      * Get the description of the aroma of the cheese.
16      * @return the aroma
17      */
18     String getAroma();
19 }

然后做一个实现类:

01 package demo.plexus-demos;
02   
03 public class ParmesanCheese
04     implements Cheese
05 {
06     public void slice( int slices )
07     {
08         throw new UnsupportedOperationException( "No can do" );
09     }
10   
11     public String 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 import org.codehaus.plexus.PlexusContainer;
02 import org.codehaus.plexus.PlexusContainerException;
03   
04 public class App
05 {
06     public static void main(String args[]) throws Exception
07     {
08         PlexusContainer container= new DefaultPlexusContainer();
09         container.dispose();
10           
11         Cheese cheese = (Cheese) container.lookup( Cheese.ROLE, "parmesan" );
12         System.out.println( "Parmesan is " + cheese.getAroma() );
13     }
14 }
发布了70 篇原创文章 · 获赞 5 · 访问量 47万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章