Plexus——Spring之外的IoC容器
Plexus是什么?它是一个IoC容器,由codehaus在管理的一个开源项目。和Spring框架不同,它并不是一个完整的,拥有各种组件的大型框架,仅仅是一个纯粹的IoC容器。本文讲解Plexus的初步使用方法。Plexus和Maven的开发者是同一群人,可以想见Plexus和Maven的紧密关系了。由于在Maven刚刚诞生的时候,Spring还不 成熟,所以Maven的开发者决定使用自己维护
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 | } |
Plexus概览
更多推荐
所有评论(0)