alvinalexander.com | career | drupal | java | mac | mysql | perl | scala | uml | unix  

Java example source code file (AbstractModule.java)

This example Java source code file (AbstractModule.java) is included in the alvinalexander.com "Java Source Code Warehouse" project. The intent of this project is to help you "Learn Java by Example" TM.

Learn more about this Java project at its project page.

Java - Java tags/keywords

abstractmodule, annotatedbindingbuilder, annotatedconstantbindingbuilder, annotation, binder, linkedbindingbuilder, matcher, membersinjector, object, provider, re-entry, reflection, scope, the, typeliteral

The AbstractModule.java Java example source code

/**
 * Copyright (C) 2006 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.google.inject;

import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.base.Preconditions.checkState;

import com.google.inject.binder.AnnotatedBindingBuilder;
import com.google.inject.binder.AnnotatedConstantBindingBuilder;
import com.google.inject.binder.LinkedBindingBuilder;
import com.google.inject.matcher.Matcher;
import com.google.inject.spi.Message;
import com.google.inject.spi.ProvisionListener;
import com.google.inject.spi.TypeConverter;
import com.google.inject.spi.TypeListener;

import java.lang.annotation.Annotation;
import java.lang.reflect.Method;

/**
 * A support class for {@link Module}s which reduces repetition and results in
 * a more readable configuration. Simply extend this class, implement {@link
 * #configure()}, and call the inherited methods which mirror those found in
 * {@link Binder}. For example:
 *
 * <pre>
 * public class MyModule extends AbstractModule {
 *   protected void configure() {
 *     bind(Service.class).to(ServiceImpl.class).in(Singleton.class);
 *     bind(CreditCardPaymentService.class);
 *     bind(PaymentService.class).to(CreditCardPaymentService.class);
 *     bindConstant().annotatedWith(Names.named("port")).to(8080);
 *   }
 * }
 * </pre>
 *
 * @author crazybob@google.com (Bob Lee)
 */
public abstract class AbstractModule implements Module {

  Binder binder;

  public final synchronized void configure(Binder builder) {
    checkState(this.binder == null, "Re-entry is not allowed.");

    this.binder = checkNotNull(builder, "builder");
    try {
      configure();
    }
    finally {
      this.binder = null;
    }
  }

  /**
   * Configures a {@link Binder} via the exposed methods.
   */
  protected abstract void configure();

  /**
   * Gets direct access to the underlying {@code Binder}.
   */
  protected Binder binder() {
    checkState(binder != null, "The binder can only be used inside configure()");
    return binder;
  }

  /**
   * @see Binder#bindScope(Class, Scope)
   */
  protected void bindScope(Class<? extends Annotation> scopeAnnotation,
      Scope scope) {
    binder().bindScope(scopeAnnotation, scope);
  }

  /**
   * @see Binder#bind(Key)
   */
  protected <T> LinkedBindingBuilder bind(Key key) {
    return binder().bind(key);
  }

  /**
   * @see Binder#bind(TypeLiteral)
   */
  protected <T> AnnotatedBindingBuilder bind(TypeLiteral typeLiteral) {
    return binder().bind(typeLiteral);
  }

  /**
   * @see Binder#bind(Class)
   */
  protected <T> AnnotatedBindingBuilder bind(Class clazz) {
    return binder().bind(clazz);
  }

  /**
   * @see Binder#bindConstant()
   */
  protected AnnotatedConstantBindingBuilder bindConstant() {
    return binder().bindConstant();
  }

  /**
   * @see Binder#install(Module)
   */
  protected void install(Module module) {
    binder().install(module);
  }

  /**
   * @see Binder#addError(String, Object[])
   */
  protected void addError(String message, Object... arguments) {
    binder().addError(message, arguments);
  }

  /**
   * @see Binder#addError(Throwable) 
   */
  protected void addError(Throwable t) {
    binder().addError(t);
  }

  /**
   * @see Binder#addError(Message)
   * @since 2.0
   */
  protected void addError(Message message) {
    binder().addError(message);
  }

  /**
   * @see Binder#requestInjection(Object)
   * @since 2.0
   */
  protected void requestInjection(Object instance) {
    binder().requestInjection(instance);
  }

  /**
   * @see Binder#requestStaticInjection(Class[])
   */
  protected void requestStaticInjection(Class<?>... types) {
    binder().requestStaticInjection(types);
  }

  /*if[AOP]*/
  /**
   * @see Binder#bindInterceptor(com.google.inject.matcher.Matcher,
   *  com.google.inject.matcher.Matcher,
   *  org.aopalliance.intercept.MethodInterceptor[])
   */
  protected void bindInterceptor(Matcher<? super Class classMatcher,
      Matcher<? super Method> methodMatcher,
      org.aopalliance.intercept.MethodInterceptor... interceptors) {
    binder().bindInterceptor(classMatcher, methodMatcher, interceptors);
  }
  /*end[AOP]*/

  /**
   * Adds a dependency from this module to {@code key}. When the injector is
   * created, Guice will report an error if {@code key} cannot be injected.
   * Note that this requirement may be satisfied by implicit binding, such as
   * a public no-arguments constructor.
   *
   * @since 2.0
   */
  protected void requireBinding(Key<?> key) {
    binder().getProvider(key);
  }

  /**
   * Adds a dependency from this module to {@code type}. When the injector is
   * created, Guice will report an error if {@code type} cannot be injected.
   * Note that this requirement may be satisfied by implicit binding, such as
   * a public no-arguments constructor.
   *
   * @since 2.0
   */
  protected void requireBinding(Class<?> type) {
    binder().getProvider(type);
  }

  /**
   * @see Binder#getProvider(Key)
   * @since 2.0
   */
  protected <T> Provider getProvider(Key key) {
    return binder().getProvider(key);
  }

  /**
   * @see Binder#getProvider(Class)
   * @since 2.0
   */
  protected <T> Provider getProvider(Class type) {
    return binder().getProvider(type);
  }

  /**
   * @see Binder#convertToTypes
   * @since 2.0
   */
  protected void convertToTypes(Matcher<? super TypeLiteral typeMatcher,
      TypeConverter converter) {
    binder().convertToTypes(typeMatcher, converter);
  }

  /**
   * @see Binder#currentStage() 
   * @since 2.0
   */
  protected Stage currentStage() {
    return binder().currentStage();
  }

  /**
   * @see Binder#getMembersInjector(Class)
   * @since 2.0
   */
  protected <T> MembersInjector getMembersInjector(Class type) {
    return binder().getMembersInjector(type);
  }

  /**
   * @see Binder#getMembersInjector(TypeLiteral)
   * @since 2.0
   */
  protected <T> MembersInjector getMembersInjector(TypeLiteral type) {
    return binder().getMembersInjector(type);
  }

  /**
   * @see Binder#bindListener(com.google.inject.matcher.Matcher,
   *  com.google.inject.spi.TypeListener)
   * @since 2.0
   */
  protected void bindListener(Matcher<? super TypeLiteral typeMatcher,
      TypeListener listener) {
    binder().bindListener(typeMatcher, listener);
  }
  
  /**
   * @see Binder#bindListener(Matcher, ProvisionListener...)
   * @since 4.0
   */
  protected void bindListener(Matcher<? super Binding bindingMatcher,
      ProvisionListener... listener) {
    binder().bindListener(bindingMatcher, listener);
  }
}

Other Java examples (source code examples)

Here is a short list of links related to this Java AbstractModule.java source code file:

... this post is sponsored by my books ...

#1 New Release!

FP Best Seller

 

new blog posts

 

Copyright 1998-2021 Alvin Alexander, alvinalexander.com
All Rights Reserved.

A percentage of advertising revenue from
pages under the /java/jwarehouse URI on this website is
paid back to open source projects.