跳到主要内容

快速启动

在本教程中,我们将创建一个 注射器 出多个DI模块。 然后我们将使用 Injector 来创建某个服务的实例。 我们将使用基于注释的方法来定义模块,因为它更具可读性。

助手类#

对于该教程,我们将需要2个辅助类。 一个 DataSource 类,表示一些数据的来源,一个 Service 类,使用从数据源检索的数据进行一些处理。

public static final class DataSource {  private final InetSocketAddress address;  private final String dbName;
  @Inject  public DataSource(InetSocketAddress address, String dbName) {    this.address = address;    this.dbName = dbName;  }
  public String queryData() {    System.out.printf("Querying %s:%s for data\n", address, dbName);    return "data";  }}
public static final class Service {  private final DataSource dataSource;
  public Service(DataSource dataSource) {    this.dataSource = dataSource;  }
  public void process() {    String data = dataSource.queryData();    System.out.printf("Processing data: '%s'\n", data);  }}
note

注意 @Inject 注解在 DataSource 构造函数上。 后面会有解释。

模块#

我们将定义两个不同的模块:一个用于配置,另一个用于服务本身。

public static class ConfigModule extends AbstractModule {  @Provides  InetSocketAddress inetSocketAddress() {    return new InetSocketAddress(1234);  }
  @Provides  String dbName() {    return "exampleDB";  }}

ConfigModule 既提供了 DataSource 的地址,也提供了一个数据库名称。

public static class ServiceModule extends AbstractModule {  @Provides  Service service(DataSource dataSource) {    return new Service(dataSource);  }}

ServiceModule 只提供 Service 本身,需要实例化 DataSource

注射器#

注射器 是由两个先前定义的模块组成的。 之后,需要注射器提供一个 Service 的实例。

public static void main(String[] args) {  Injector injector = Injector.of(new ConfigModule(), new ServiceModule());  Service service = injector.getInstance(Service.class);  service.process();}

服务 需要 数据源 被实例化,但我们没有在任何模块中明确提供 数据源。 由于 @Inject 注解在 DataSource's constructor上,injector注入了所需的依赖关系,并实例化了 DataSourceservice.process() 调用的输出是。

查询0.0.0.0/0.0.0.0:1234:exampleDB的数据处理数据。'数据'

你可以在以下网站上找到实例来源 Github