前言
今天在学习maven源码时,发现其中使用到了Plexus框架,它也是一个IOC容器(类似Spring和Guice),在maven中被大量使用。
添加依赖
<dependency>
<groupId>org.eclipse.sisu</groupId>
<artifactId>org.eclipse.sisu.plexus</artifactId>
<version>0.3.4</version>
</dependency>
<dependency>
<groupId>com.google.inject</groupId>
<artifactId>guice</artifactId>
<version>4.1.0</version>
</dependency>
Plexus底层是通过扩展Guice来实现的
定义Bean和依赖注入
import lombok.Getter;
import lombok.Setter;
@Setter
@Getter
public class AddressService {
private String province;
private String city;
public String queryAddress() {
return province + city;
}
}
public class UserService {
private AddressService addressService;
public void queryUser() {
System.out.println(addressService.queryAddress());
}
}
定义两个bean,UserService依赖AddressService。
配置文件
<component-set>
<components>
<component>
<role>com.imooc.sourcecode.java.google.plexus.test1.AddressService</role>
<role-hint>addressService</role-hint>
<implementation>com.imooc.sourcecode.java.google.plexus.test1.AddressService
</implementation>
<configuration>
<province>山西</province>
<city>太原</city>
</configuration>
</component>
<component>
<role>com.imooc.sourcecode.java.google.plexus.test1.UserService</role>
<role-hint>userService</role-hint>
<implementation>com.imooc.sourcecode.java.google.plexus.test1.UserService
</implementation>
<requirements>
<requirement>
<role>com.imooc.sourcecode.java.google.plexus.test1.AddressService</role>
<field-name>addressService</field-name>
</requirement>
</requirements>
</component>
</components>
</component-set>
在META-INF/plexus下创建components.xml文件,类似于Spring的配置文件,使用configuration来配置各个属性,使用requirements来配置依赖的其他bean。
如果使用内部类的话,role需要定义为test1$UserService这种格式,不然类加载器找不到。
客户端使用
import org.codehaus.plexus.DefaultPlexusContainer;
import org.codehaus.plexus.PlexusContainer;
import org.codehaus.plexus.PlexusContainerException;
import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
/**
* 测试Plexus的依赖注入
*/
public class Client {
public static void main(String[] args) throws PlexusContainerException, ComponentLookupException {
PlexusContainer container = new DefaultPlexusContainer();
UserService userService = container.lookup(UserService.class);
userService.queryUser();
}
}
输出结果为
山西太原
在maven中的使用
总结
Plexus框架在开源项目中使用的很少,了解即可。