依赖注入框架之Plexus简单使用


前言

今天在学习maven源码时,发现其中使用到了Plexus框架,它也是一个IOC容器(类似Spring和Guice),在maven中被大量使用。

添加依赖


  org.eclipse.sisu
  org.eclipse.sisu.plexus
  0.3.4


  com.google.inject
  guice
  4.1.0

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。

配置文件


  
    
      com.imooc.sourcecode.java.google.plexus.test1.AddressService
      addressService
      com.imooc.sourcecode.java.google.plexus.test1.AddressService
      
      
        山西
        太原
      
    
    
      com.imooc.sourcecode.java.google.plexus.test1.UserService
      userService
      com.imooc.sourcecode.java.google.plexus.test1.UserService
      
      
        
          com.imooc.sourcecode.java.google.plexus.test1.AddressService
          addressService
        
      
    
  

在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框架在开源项目中使用的很少,了解即可。

参考

Plexus Site