Skip to content

ExtendingGuice

Googler edited this page Mar 18, 2020 · 8 revisions

Guice's SPI for authors of tools, extensions and plugins

The service provider interface exposes Guice's internal models to aid in the development in tools, extensions, and plugins.

Core Abstractions

  • InjectionPoint : A constructor, field or method that can receive injections. Typically this is a member with the @Inject annotation. For non-private, no argument constructors, the member may omit the annotation. Each injection point has a collection of dependencies.
  • Key: A type, plus an optional binding annotation.
  • Dependency: A key, optionally associated to an injection point. These exist for injectable fields, and for the parameters of injectable methods and constructors.
  • Element: A configuration unit, such as a bind or requestInjection statement. Elements are visitable
  • Module: A collection of configuration elements. Extracting the elements of a module enables static analysis and code-rewriting. You can inspect, rewrite, and validate these elements, and use them to build new modules.
  • Injector: Manages the application's object graph, as specified by modules. SPI access to the injector works like reflection. It can be used to retrieve the application's bindings and dependency graph.

The Elements SPI page has more information about using these classes.

Abstractions for Extension Authors

(New in Guice 3.0)

  • @Toolable: An annotation used on methods also annotated with @Inject. This instructs Guice to inject the method even in Stage.TOOL. |Typically used for extensions that need to gather information to implement HasDependencies or validate requirements and fail early for easier testing.|
  • ProviderWithExtensionVisitor: An interface that provider instances implement to allow extensions to visit custom subinterfaces of BindingTargetVisitor. See Extensions SPI for more information.

The Extensions SPI page has more information about writing extensions that expose an SPI

Examples

Log a warning for each static injection in your Modules:

  public void warnOfStaticInjections(Module... modules) {
    for (Element element : Elements.getElements(modules)) {
      element.acceptVisitor(new DefaultElementVisitor<Void>() {
        @Override
        public Void visit(StaticInjectionRequest element) {
          logger.warning("Static injection is fragile! Please fix "
              + element.getType().getName() + " at " + element.getSource());
          return null;
        }
      });
    }
  }
Clone this wiki locally